[アップデート] Amazon RDSがRDS Service APIのVPC エンドポイントでIPv6に対応しました
はじめに
おのやんです。
Amazon RDS(以下、RDS)Service APIのVPCエンドポイントが、IPv6に対応しました。
RDS Service APIのVPCエンドポイントは、もともとパブリックエンドポイントでIPv6をサポートしていましたが、今回のアップデートでプライベートなVPCエンドポイント(AWS PrivateLink)でもIPv6がサポートされるようになりました。
こちらの機能は、すべてのAWSリージョンと、AWS GovCloud (US) リージョンで利用可能です。
実際にやってみた
ということで、今回はこちらのアップデート内容を実際にやってみたいと思います。今回は実際にIPv6対応のVPCを作成し、VPCエンドポイント経由でRDS Service APIにアクセスしてみます。今回はap-northeast-1(東京リージョン)で実施します。

今回は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の方でもデュアルスタックが選択できるようになります。
こちらがサブネットで選択できるデュアルスタックのチェックボックスです。

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

ちなみに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アドレスタイプ」が「デュアルスタック」になっていることが確認できます。

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のみの設定も可能です。

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







