CI部 柿﨑です。
IPv4 CIDRの追加、IPv6の有効化が必要なVPCを作る機会がございました。
CFnで書くのに少し苦戦したため、備忘録的に記載します。
作るものは以下です。
- VPC (IPv4 CIDRの追加、IPv6の有効化)
- IPv4 追加CIDRは192.168.1.0/24
- IPv6 CIDRはAmazon Poolから自動採番
- サブネット (IPv6の有効化)
- IPv6 CIDRはAmazon Poolから自動採番されたCIDRの若番を使用 (末尾が「00::/64」のアドレスから使用。)
上記のリソースさえ作れたら躓くポイントは少ないかなと思われます。
CFnテンプレート作成時のポイントは以下。
- VPC
- 1つの「AWS::EC2::VPCCidrBlock」で、IPv4 CIDRの追加とIPv6の有効化を一緒に記述できないため分ける
- 参考情報: AWS::EC2::VPCCidrBlock
- サブネット
- DependsOn属性を使用してIPv6の有効化の後に実行されるようにする
- IPv6 CIDRの返り値は「AWS::EC2::VPC」を指定する
- IPv6 CIDRの返り値が末尾「00::/56」の形式で取得されるため、組み込み関数「Fn::Sub」を使用して「00::/64」の形式とする
- 参考情報1: milesjordan/vpc.yaml
- 参考情報2: AWS::EC2::VPC.Return values
AWSTemplateFormatVersion: 2010-09-09 Description: VPC, Subnet Resources: # VPC TestVpc01: Type: AWS::EC2::VPC Properties: CidrBlock: 192.168.0.0/24 EnableDnsHostnames: true EnableDnsSupport: true Tags: - Key: Name Value: test-vpc-01 ## IPv4 Cidr追加 TestVpc01IPv4: Type: AWS::EC2::VPCCidrBlock Properties: CidrBlock: 192.168.1.0/24 VpcId: !Ref TestVpc01 ## IPv6 Cidr追加 TestVpc01IPv6: Type: AWS::EC2::VPCCidrBlock Properties: AmazonProvidedIpv6CidrBlock: true VpcId: !Ref TestVpc01 # Subnet PublicA01Subnet: DependsOn: TestVpc01IPv6 Type: AWS::EC2::Subnet Properties: AssignIpv6AddressOnCreation: true Ipv6CidrBlock: Fn::Sub: - "${VpcPart}${SubnetPart}" - VpcPart: !Select [ 0, !Split [ '00::/56', !Select [ 0, !GetAtt TestVpc01.Ipv6CidrBlocks ]]] SubnetPart: '00::/64' AvailabilityZone: ap-northeast-1a CidrBlock: 192.168.0.0/28 Tags: - Key: Name Value: PublicA-01 VpcId: !Ref TestVpc01 PublicC01Subnet: DependsOn: TestVpc01IPv6 Type: AWS::EC2::Subnet Properties: AssignIpv6AddressOnCreation: true Ipv6CidrBlock: Fn::Sub: - "${VpcPart}${SubnetPart}" - VpcPart: !Select [ 0, !Split [ '00::/56', !Select [ 0, !GetAtt TestVpc01.Ipv6CidrBlocks ]]] SubnetPart: '01::/64' AvailabilityZone: ap-northeast-1c CidrBlock: 192.168.0.16/28 Tags: - Key: Name Value: PublicC-01 VpcId: !Ref TestVpc01
上記のCFnテンプレートを流した結果が以下。
VPC
サブネット
以上です。