【備忘録】CloudFormationで IPv6 対応のVPCとサブネットを作る【CFn】

記事タイトルとURLをコピーする

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 f:id:swx-kakizaki:20210728155413j:plain

サブネット f:id:swx-kakizaki:20210728155417j:plain

以上です。

柿﨑 拓人 (記事一覧)

クラウドインテグレーション部

AWS移行案件の要件定義~構築をメインに担当。
最近はボルダリングとバドミントンをやっています。