mazyu36の日記

某SIer所属のクラウドエンジニアのブログ

CDKのL2 ConstructでVPCのDual Stackを設定しIPv6による通信を試す

VPCのL2 ConstructでDual Stackがサポートされるのを待っていたところ、v2.121.0でサポートされていました。

今回はこちらを試してみます。

※パブリックIPv4への課金が迫っているというのもホットな話題ですね。

aws.amazon.com

目次

今回試すこと

前回の記事でGlobal Accelerator+ALBの構成を実装しました。 mazyu36.hatenablog.com

Global AcceleratorとALBはDual Stackをサポートしているので、こちらを題材にDual Stackを試してみます。

IPv6に対応しているサービスは以下から確認可能です。

docs.aws.amazon.com

アーキテクチャ

今回構築するのは以下です。Global Accelerator、ALB、VPCを全てDual Stackとし、IPv6で通信ができるかを確認します。

前回の記事の構成から大きく以下2点を変更しています。 * ALBのターゲットをLambdaからEC2に変更しています。これはIPv6のターゲットグループだとIP or Instanceのターゲットしかサポートされていないためです(参考)。 * EC2で動確用にhttpdを設定したかったため、NAT Gatewayを用意しインターネットに抜けられるようにしています。

実装

以下にあります。

github.com

Dual Stack対応の部分だけ簡単に見ていきます。全部Dual Stackを指定するだけなので簡単です。

VPC

今回アップデートが入ったところです。ipProtocolでDual Stackが指定できるようになりました。

    const vpc = new ec2.Vpc(this, 'Vpc', {
      natGateways: 1,
      maxAzs: 2,
      subnetConfiguration: [
        {
          name: 'PublicSubnet',
          subnetType: ec2.SubnetType.PUBLIC,
        },
        {
          name: 'PrivateSubnet',
          subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
        }
      ],
      ipProtocol: ec2.IpProtocol.DUAL_STACK,  // Dual Stack
      enableDnsHostnames: true,
      enableDnsSupport: true
    }
    )

ALB

ALBでもDual Stackを指定します。

    const alb = new elbv2.ApplicationLoadBalancer(this, 'ApplicationLoadBalancer', {
      vpc: vpc,
      vpcSubnets: vpc.selectSubnets({ subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }),
      internetFacing: false,
      ipAddressType: elbv2.IpAddressType.DUAL_STACK  // Dual Stack
    })

Global Accelerator

アクセラレータでもDual Stackを指定します。

    const accelerator = new globalaccelerator.Accelerator(this, 'Accelerator', {
      ipAddressType: globalaccelerator.IpAddressType.DUAL_STACK  // Dual Stack
    })

動作確認

デプロイ状況の確認

VPCはCIDRタブでIPv6が割り当てられていることが確認できます。

ALBを確認するとDualStackとなっています。

Global Acceleratorでは静的IPアドレスとしてIPv6が2つと、デュアルスタックDNS名が払い出されています。

接続確認

curlでデュアルスタックDNS名を元にIPv6で通信できるか確認したところ、無事通信ができました。

curl -v6 axxxxxx.dualstack.awsglobalaccelerator.com
*   Trying [2600:9000:a407:b741:9110:7384:34d9:2ea6]:80...
* Connected to axxxxxx.dualstack.awsglobalaccelerator.com ([MASK]:34d9:2ea6) port 80 (#0)
> GET / HTTP/1.1
> Host: axxxxxx.dualstack.awsglobalaccelerator.com
> User-Agent: curl/8.1.2
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Mon, 22 Jan 2024 15:05:56 GMT
< Content-Type: text/html; charset=UTF-8
< Content-Length: 12
< Connection: keep-alive
< Server: Apache/2.4.58 ()
< Upgrade: h2,h2c
< Last-Modified: Mon, 22 Jan 2024 14:47:20 GMT
< ETag: "c-60f89e82ab318"
< Accept-Ranges: bytes
<
Hello World
* Connection #0 to host axxxxxx.dualstack.awsglobalaccelerator.com left intact

digでデュアルスタックDNS名でAAAAアドレスを問い合わせると、静的IPアドレスが2つ返ってきます(結果は省略)

 dig axxxxxx.dualstack.awsglobalaccelerator.com AAAA +short

終わりに

VPCのL2 ConstructのDual Stack対応により、簡単にIPv6対応が可能になりました。パブリックIPv4の削減が捗りそうです。

一方で課金対策として完全なIPv6オンリーの構成を組むことは、まだまだ難しい認識なのでここは今後のAWSのサービスのアップデートに期待したいところです。