🐕

[AWS]CloudFormationでVPCのIPv6 CIDRを取得してサブネットに割り当てる

2024/01/29に公開

背景

CloudFormationでAmazon提供のIPv6CIDRを有効にした際、サブネットのCIDR指定に戸惑った。

結論

組み込み関数のCidrとSelectを使用する
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-cidr.html
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-select.html

AWSTemplateFormatVersion: 2010-09-09
Description: Create VPC
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/24
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: test-vpc

  VPCIPv6:
    Type: AWS::EC2::VPCCidrBlock
    Properties:
      AmazonProvidedIpv6CidrBlock: true
      VpcId: !Ref VPC

  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Select
        - 0
        - Fn::GetAZs: !Ref AWS::Region
      VpcId: !Ref VPC
      CidrBlock: 10.0.0.0/28
      Ipv6CidrBlock: !Select
        - 0
        - !Cidr
          - !Select
            - 0
            - !GetAtt VPC.Ipv6CidrBlocks
          - 1
          - 68
      Tags:
        - Key: Name
          Value: test-public-subnet

解説

VPCのIPv6 CIDRの取得

公式ドキュメントに記載されている通り、VPCのIPv6CIDRを取得する場合は

!GetAtt VPC.Ipv6CidrBlocks

を使用する。
返却値は、リストで渡されることになる。

[ 2001:db8:1234:1a00::/56 ]

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html

リストで渡されるためインデックスを指定し、オブジェクトを取得する必要がある。

- !Select
  - 0
  - !GetAtt VPC.Ipv6CidrBlocks

# 返却値
2001:db8:1234:1a00::/56

サブネットのIPv6 CIDRの指定

上記のCloudFormationテンプレートに記載の

- !Cidr
  - !Select
    - 0
    - !GetAtt VPC.Ipv6CidrBlocks
  - 1
  - 68

は次のように読み取ることができる。

- !Cidr
  - 2001:db8:1234:1a00::/56
  - 1
  - 68

「2001:db8:1234:1a00::/56」から「/60」のCIDRを「1つ」作成するという記述になる。

補足

上記68はcidrBitsの引数としており、
IPv6 の場合は 128 から引いた数値がプレフィックス長となる。

IPv6については下記が非常に参考になっている。
https://zenn.dev/noraworld/articles/ipv6-addresses-representation-and-type

参考

https://dev.classmethod.jp/articles/ipv6-subnet-separating-cidr-function/

Discussion