[アップデート] Amazon RDSがRDS Service APIのVPC エンドポイントでIPv6に対応しました

[アップデート] Amazon RDSがRDS Service APIのVPC エンドポイントでIPv6に対応しました

2026.02.03

はじめに

おのやんです。

Amazon RDS(以下、RDS)Service APIのVPCエンドポイントが、IPv6に対応しました。

https://aws.amazon.com/about-aws/whats-new/2026/01/amazon-rds-ipv6-vpc-endpoints-service-apis/

RDS Service APIのVPCエンドポイントは、もともとパブリックエンドポイントでIPv6をサポートしていましたが、今回のアップデートでプライベートなVPCエンドポイント(AWS PrivateLink)でもIPv6がサポートされるようになりました。

こちらの機能は、すべてのAWSリージョンと、AWS GovCloud (US) リージョンで利用可能です。

実際にやってみた

ということで、今回はこちらのアップデート内容を実際にやってみたいと思います。今回は実際にIPv6対応のVPCを作成し、VPCエンドポイント経由でRDS Service APIにアクセスしてみます。今回はap-northeast-1(東京リージョン)で実施します。

スクリーンショット 2026-02-02 18.57.08

今回はVPC・サブネット・セキュリティグループ・EC2インスタンス)はAWS CloudFormation(以下、Cfn)で作成しておきます。

CFnテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Description: 'VPC with IPv6 support for RDS API VPC endpoint demo - using SSM Session Manager'

Parameters:
  LatestAmiId:
    Description: Latest Amazon Linux 2023 AMI ID
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64

Resources:
  # VPC
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: rds-ipv6-demo-vpc

  # IPv6 CIDR Block
  IPv6CidrBlock:
    Type: AWS::EC2::VPCCidrBlock
    Properties:
      VpcId: !Ref VPC
      AmazonProvidedIpv6CidrBlock: true

  # Public Subnet (for NAT Gateway)
  PublicSubnet:
    Type: AWS::EC2::Subnet
    DependsOn: IPv6CidrBlock
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      Ipv6CidrBlock: !Select [0, !Cidr [!Select [0, !GetAtt VPC.Ipv6CidrBlocks], 256, 64]]
      AvailabilityZone: !Select [0, !GetAZs '']
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: rds-ipv6-demo-public-subnet

  # Private Subnet (for EC2 Instance)
  PrivateSubnet:
    Type: AWS::EC2::Subnet
    DependsOn: IPv6CidrBlock
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
      Ipv6CidrBlock: !Select [1, !Cidr [!Select [0, !GetAtt VPC.Ipv6CidrBlocks], 256, 64]]
      AvailabilityZone: !Select [0, !GetAZs '']
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          Value: rds-ipv6-demo-private-subnet

  # Internet Gateway
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: rds-ipv6-demo-igw

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

  # Elastic IP for NAT Gateway
  NATGatewayEIP:
    Type: AWS::EC2::EIP
    DependsOn: AttachGateway
    Properties:
      Domain: vpc
      Tags:
        - Key: Name
          Value: rds-ipv6-demo-nat-eip

  # NAT Gateway
  NATGateway:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt NATGatewayEIP.AllocationId
      SubnetId: !Ref PublicSubnet
      Tags:
        - Key: Name
          Value: rds-ipv6-demo-nat

  # Public Route Table
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: rds-ipv6-demo-public-rtb

  # IPv4 Route for Public Subnet
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  # IPv6 Route for Public Subnet
  PublicRouteIPv6:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationIpv6CidrBlock: ::/0
      GatewayId: !Ref InternetGateway

  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable

  # Private Route Table
  PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: rds-ipv6-demo-private-rtb

  # IPv4 Route for Private Subnet (via NAT Gateway)
  PrivateRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PrivateRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NATGateway

  PrivateSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet
      RouteTableId: !Ref PrivateRouteTable

  # Security Group for VPC Endpoint
  VPCEndpointSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: rds-api-endpoint-sg
      GroupDescription: Security group for RDS API VPC endpoint
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 10.0.0.0/16
          Description: Allow HTTPS from VPC (IPv4)
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIpv6: !Select [0, !GetAtt VPC.Ipv6CidrBlocks]
          Description: Allow HTTPS from VPC (IPv6)
      Tags:
        - Key: Name
          Value: rds-api-endpoint-sg

  # Security Group for EC2 Instance
  EC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: ec2-instance-sg
      GroupDescription: Security group for EC2 instance (no inbound rules needed for SSM)
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: ec2-instance-sg

  # Security Group for SSM VPC Endpoints
  SSMEndpointSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: ssm-endpoint-sg
      GroupDescription: Security group for SSM VPC endpoints
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 10.0.0.0/16
          Description: Allow HTTPS from VPC (IPv4)
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIpv6: !Select [0, !GetAtt VPC.Ipv6CidrBlocks]
          Description: Allow HTTPS from VPC (IPv6)
      Tags:
        - Key: Name
          Value: ssm-endpoint-sg

  # SSM VPC Endpoint
  SSMEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC
      ServiceName: !Sub 'com.amazonaws.${AWS::Region}.ssm'
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      SubnetIds:
        - !Ref PrivateSubnet
      SecurityGroupIds:
        - !Ref SSMEndpointSecurityGroup

  # SSM Messages VPC Endpoint
  SSMMessagesEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC
      ServiceName: !Sub 'com.amazonaws.${AWS::Region}.ssmmessages'
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      SubnetIds:
        - !Ref PrivateSubnet
      SecurityGroupIds:
        - !Ref SSMEndpointSecurityGroup

  # EC2 Messages VPC Endpoint
  EC2MessagesEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC
      ServiceName: !Sub 'com.amazonaws.${AWS::Region}.ec2messages'
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      SubnetIds:
        - !Ref PrivateSubnet
      SecurityGroupIds:
        - !Ref SSMEndpointSecurityGroup

  # IAM Role for EC2 Instance
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub '${AWS::StackName}-ec2-role'
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonRDSReadOnlyAccess
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      Tags:
        - Key: Name
          Value: rds-ipv6-demo-ec2-role

  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      InstanceProfileName: !Sub '${AWS::StackName}-ec2-profile'
      Roles:
        - !Ref EC2Role

  # EC2 Instance (in Private Subnet)
  EC2Instance:
    Type: AWS::EC2::Instance
    DependsOn:
      - PrivateSubnetRouteTableAssociation
      - NATGateway
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: t3.micro
      IamInstanceProfile: !Ref EC2InstanceProfile
      NetworkInterfaces:
        - AssociatePublicIpAddress: false
          DeviceIndex: 0
          GroupSet:
            - !Ref EC2SecurityGroup
          SubnetId: !Ref PrivateSubnet
          Ipv6AddressCount: 1
      Tags:
        - Key: Name
          Value: rds-ipv6-demo-instance
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
          # Install dig command for DNS testing
          dnf install -y bind-utils

Outputs:
  VPCId:
    Description: VPC ID
    Value: !Ref VPC
    Export:
      Name: !Sub '${AWS::StackName}-VPC-ID'

  PrivateSubnetId:
    Description: Private Subnet ID (for EC2 and VPC Endpoint)
    Value: !Ref PrivateSubnet
    Export:
      Name: !Sub '${AWS::StackName}-Private-Subnet-ID'

  VPCEndpointSecurityGroupId:
    Description: Security Group ID for RDS API VPC Endpoint
    Value: !Ref VPCEndpointSecurityGroup
    Export:
      Name: !Sub '${AWS::StackName}-VPCEndpoint-SG-ID'

  EC2InstanceId:
    Description: EC2 Instance ID
    Value: !Ref EC2Instance

  EC2PrivateIP:
    Description: EC2 Instance Private IP Address
    Value: !GetAtt EC2Instance.PrivateIp

  SSMEndpointId:
    Description: SSM VPC Endpoint ID
    Value: !Ref SSMEndpoint

  SSMMessagesEndpointId:
    Description: SSM Messages VPC Endpoint ID
    Value: !Ref SSMMessagesEndpoint

  EC2MessagesEndpointId:
    Description: EC2 Messages VPC Endpoint ID
    Value: !Ref EC2MessagesEndpoint

  VPCIPv6CidrBlock:
    Description: VPC IPv6 CIDR Block
    Value: !Select [0, !GetAtt VPC.Ipv6CidrBlocks]

  ConnectionCommand:
    Description: Command to connect to the instance using SSM Session Manager
    Value: !Sub |
      aws ssm start-session --target ${EC2Instance} --region ${AWS::Region}

上記でVPCなどのAWSリソースが作成できたら、次にRDS Service API用のVPCエンドポイントをデュアルスタック(IPV4・IPv6両方)で作成します。

VPCエンドポイント作成時に、IPv6やサブネットがチェックボックスで検索できるようになっています。ちなみにサブネットのIPアドレスタイプとしてデュアルスタックを選択したに、VPCの方でもデュアルスタックが選択できるようになります。

こちらがサブネットで選択できるデュアルスタックのチェックボックスです。

スクリーンショット 2026-02-02 17.08.36

こちらを選んだのち、VPCの方でも選択できます。

スクリーンショット 2026-02-02 17.08.47

ちなみにAWS CLI経由だと、次のようなコマンドでもVPCエンドポイントを1発で作成できました。

aws ec2 create-vpc-endpoint \
    --vpc-id vpc-0618855a8d9d42add \
    --vpc-endpoint-type Interface \
    --service-name com.amazonaws.ap-northeast-1.rds \
    --subnet-ids subnet-0cfe65e6d8aa9b954 \
    --security-group-ids sg-07173d97ab195929d \
    --ip-address-type dualstack \ # デュアルスタックでIPv4・IPv6を有効化
    --private-dns-enabled \
    --region ap-northeast-1

VPCエンドポイントが作成されました。コンソールから確認すると、「DNSレコードのIPタイプ」と「IPアドレスタイプ」が「デュアルスタック」になっていることが確認できます。

スクリーンショット 2026-02-02 17.01.50

VPCエンドポイントが準備できましたら、AWSマネジメントコンソールを操作して、SSM Session ManagerでEC2インスタンスに接続します。

プライベート DNS を有効にしているため、通常の RDS エンドポイント名(rds.ap-northeast-1.amazonaws.com)で名前解決できます。digコマンドを実行すると、VPCエンドポイント用ENIのIPv6アドレスが返ってきました

$ dig AAAA rds.ap-northeast-1.amazonaws.com +short
2406:da14:310:cf01:729c:3d33:561f:d3cc

デュアルスタックの設定ですので、しっかりIPv4(Aレコード)も解決できます。

$ dig A rds.ap-northeast-1.amazonaws.com +short
10.0.2.145

デュアルスタックの設定ではなく、IPv6のみの設定も可能です。

スクリーンショット 2026-02-02 17.21.17

まとめ

Amazon RDS APIのVPCエンドポイントがIPv6に対応しました。IPv6対応のサービスが徐々に増えていっているので、遅れずにキャッチアップしたいですね。では!

この記事をシェアする

FacebookHatena blogX

関連記事