🐕
[AWS]CloudFormationでVPCのIPv6 CIDRを取得してサブネットに割り当てる
背景
CloudFormationでAmazon提供のIPv6CIDRを有効にした際、サブネットのCIDR指定に戸惑った。
結論
組み込み関数のCidrとSelectを使用する
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 ]
リストで渡されるためインデックスを指定し、オブジェクトを取得する必要がある。
- !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については下記が非常に参考になっている。
参考
Discussion