[アップデート] Amazon CloudFront がついに IPv6 オリジンをサポートしたので使ってみた

[アップデート] Amazon CloudFront がついに IPv6 オリジンをサポートしたので使ってみた

2025.09.09

いわさです。

これまで Amazon CloudFront はユーザーから CloudFront までの経路は IPv6 接続が可能だったのですが、CloudFront からオリジンへの経路は IPv4 のみがサポートされていました。
以下のブログでは IPv6 のみをサポートする ALB をオリジンとして CloudFront ディストリビューションを構成した時に接続に失敗する様子が検証されています。

https://dev.classmethod.jp/articles/application-load-balancer-network-load-balancer-end-to-end-ipv6-support/

先日のアップデートでついに IPv6 オリジンを設定できるようになりました。コンソールや API には数日前に降ってきていたのですが、アナウンスも今朝ついに出ました。

https://aws.amazon.com/about-aws/whats-new/2025/09/amazon-cloudfront-ipv6-origins/

設定方法ですが、CloudFront でオリジン設定を行う時に「Customize origin settings」から IPv6 を設定することができます。
対象のオリジンタイプは Amazon S3 と VPC オリジン以外の、オリジンです。(以下)

AC560C2D-B4EE-4446-926F-2C183A640E42.png

今回は冒頭ののんピさんブログのように、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 のIpAddressTypedualstack-without-public-ipv4を指定しています。
これを設定することで次のオプションが有効となり、IPv6 アドレスのみがパブリックに割り当てられます。

FBCC7B06-9D35-4A75-8FC8-582433AF9361.png

ということでまずはデプロイ後に 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 ディストリビューションを作成します。

まずはデフォルトのオリジン設定で試してみましょう。
オリジンタイプに「Elastic Load Balancer」を選択し、オリジンに先ほど作成した IPv6 Only な ALB を指定します。
オリジン設定では「Use recommended origin settings」を一旦選択します。

B9BB847C-13AE-433E-88A1-D93604F62D3A.png

作成後、ディストリビューションのエンドポイントにリクエストを送ってみます。

			
			% 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」で作り直してみます。

AE963AB0-B048-4BA6-BE2B-27EA6857DCB2.png

今回のアップデートで次のように Origin IP address type が選択できるようになっています。
ここで IPv6-only あるいは DualStack を選択しましょう。

012DCCFC-3A74-4CA4-BA28-9142A46F70FB.png

作成後にディストリビューションにアクセスしてみると...

			
			% 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 に寄せやすくなったのではないでしょうか。

この記事をシェアする

FacebookHatena blogX

関連記事