[アップデート] Amazon CloudFront がついに IPv6 オリジンをサポートしたので使ってみた
いわさです。
これまで Amazon CloudFront はユーザーから CloudFront までの経路は IPv6 接続が可能だったのですが、CloudFront からオリジンへの経路は IPv4 のみがサポートされていました。
以下のブログでは IPv6 のみをサポートする ALB をオリジンとして CloudFront ディストリビューションを構成した時に接続に失敗する様子が検証されています。
先日のアップデートでついに IPv6 オリジンを設定できるようになりました。コンソールや API には数日前に降ってきていたのですが、アナウンスも今朝ついに出ました。
設定方法ですが、CloudFront でオリジン設定を行う時に「Customize origin settings」から IPv6 を設定することができます。
対象のオリジンタイプは Amazon S3 と VPC オリジン以外の、オリジンです。(以下)
今回は冒頭ののんピさんブログのように、IPv6 Only な ALB をオリジンにしたディストリビューションを作成してみます。
IPv6 用の ALB と VPC の確認
まず、オリジンを用意する必要がありますが CloudFormation テンプレートを用意しました。
AWSTemplateFormatVersion: '2010-09-09'
Description: 'IPv6-only ALB with fixed response in new VPC'
Resources:
# VPC
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsHostnames: true
EnableDnsSupport: true
Tags:
- Key: Name
Value: IPv6-ALB-VPC
# IPv6 CIDR Block
IPv6CidrBlock:
Type: AWS::EC2::VPCCidrBlock
Properties:
VpcId: !Ref VPC
AmazonProvidedIpv6CidrBlock: true
# Internet Gateway
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: IPv6-ALB-IGW
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref InternetGateway
# Public Subnets
PublicSubnet1:
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: false
AssignIpv6AddressOnCreation: true
Tags:
- Key: Name
Value: IPv6-ALB-PublicSubnet1
PublicSubnet2:
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 [1, !GetAZs '']
MapPublicIpOnLaunch: false
AssignIpv6AddressOnCreation: true
Tags:
- Key: Name
Value: IPv6-ALB-PublicSubnet2
# Route Table
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: IPv6-ALB-PublicRouteTable
# IPv4 Route
PublicRoute:
Type: AWS::EC2::Route
DependsOn: AttachGateway
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
# IPv6 Route
PublicRouteIPv6:
Type: AWS::EC2::Route
DependsOn: AttachGateway
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationIpv6CidrBlock: ::/0
GatewayId: !Ref InternetGateway
# Route Table Associations
PublicSubnetRouteTableAssociation1:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet1
RouteTableId: !Ref PublicRouteTable
PublicSubnetRouteTableAssociation2:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet2
RouteTableId: !Ref PublicRouteTable
# Security Group for ALB (IPv6 only)
ALBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security group for IPv6-only ALB
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIpv6: ::/0
Tags:
- Key: Name
Value: IPv6-ALB-SecurityGroup
# Application Load Balancer (IPv6 only)
ApplicationLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: IPv6-ALB
Scheme: internet-facing
Type: application
IpAddressType: dualstack-without-public-ipv4
Subnets:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
SecurityGroups:
- !Ref ALBSecurityGroup
Tags:
- Key: Name
Value: IPv6-ALB
# ALB Listener with fixed response
ALBListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: fixed-response
FixedResponseConfig:
StatusCode: 200
ContentType: text/plain
MessageBody: "Hello from IPv6-only ALB!"
LoadBalancerArn: !Ref ApplicationLoadBalancer
Port: 80
Protocol: HTTP
ポイントとしては ALB のIpAddressType
にdualstack-without-public-ipv4
を指定しています。
これを設定することで次のオプションが有効となり、IPv6 アドレスのみがパブリックに割り当てられます。
ということでまずはデプロイ後に ALB に直接アクセスしてみましょう。
cURL の IPv4 指定オプションと IPv6 指定オプションを使ってみます。
% curl -4 http://IPv6-ALB-696766008.ap-northeast-1.elb.amazonaws.com/
curl: (6) Could not resolve host: IPv6-ALB-696766008.ap-northeast-1.elb.amazonaws.com
% curl -6 http://IPv6-ALB-696766008.ap-northeast-1.elb.amazonaws.com/
Hello from IPv6-only ALB!
前述の ALB の設定によって AAAA レコードでしか名前解決できないので、IPv6 でのみ接続できました。
CloudFront の設定
では今度は CloudFront ディストリビューションを作成します。
デフォルトの Use recommended origin settings だと IPv6 オリジンは有効にならない
まずはデフォルトのオリジン設定で試してみましょう。
オリジンタイプに「Elastic Load Balancer」を選択し、オリジンに先ほど作成した IPv6 Only な ALB を指定します。
オリジン設定では「Use recommended origin settings」を一旦選択します。
作成後、ディストリビューションのエンドポイントにリクエストを送ってみます。
% curl https://ditv5xvnnrwy4.cloudfront.net/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>ERROR</H1>
<H2>Failed to contact the origin.</H2>
<HR noshade size="1px">
</BODY></HTML>
<BR clear="all">
<PRE>
Generated Mon, 08 Sep 2025 20:33:54 GMT
Request ID: NXYrWrqCDMqFPBg77y6r2SegZNMkESNx1oEnQfBl7CQzd8UsbBt10g==
</PRE>
</BODY></HTML>
冒頭ののんピさんのブログと同じで、オリジン接続に失敗していますね。
Customize origin settings で明示的な指定が必要
では次に「Customize origin settings」で作り直してみます。
今回のアップデートで次のように Origin IP address type が選択できるようになっています。
ここで IPv6-only あるいは DualStack を選択しましょう。
作成後にディストリビューションにアクセスしてみると...
% curl -4 https://d376s6qokjubhw.cloudfront.net/
Hello from IPv6-only ALB!
% curl -6 https://d376s6qokjubhw.cloudfront.net/
Hello from IPv6-only ALB!
CloudFront は IPv4/IPv6 をサポートしていますので、どちらの場合でもオリジン ALB のリクエストが CloudFront ディストリビューション経由でレスポンスされていることが確認できました。
さいごに
本日は Amazon CloudFront がついに IPv6 オリジンをサポートしたので使ってみました。
IPv4 の有償化以降、IPv6 対応を意識する必要があったのですが、CloudFront を使う多くのワークロードでは IPv6 全振りみたいなのは難しい状況でした。
今回のアップデートで IPv4 サポートは CloudFront に任せて、オリジン側を IPv6 に寄せやすくなったのではないでしょうか。