【IPv6 on AWS 】IaCでCIDR関連付けしてみた

2022.04.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!AWS事業本部コンサルティング部のたかくに(@takakuni_)です。

今回は、IPv6アドレスをサブネットに動的に関連付けしてみようと思います。

VPC,サブネットとIPv6の関係性

まず初めに、AWSでIPv6アドレスを割り当てる際は、以下のようなルールがあります。

AWS所有のIPアドレスから割り当てる場合

  • VPCは、「/56」の範囲でAWSのプールから自動的に割り当てられます
  • サブネットは、「/64」の固定CIDRで割り当て可能です

つまり、AWSのプールから割り当てる場合、事前にIPv6アドレスの指定は出来ません。

Cidr,cidrsubnet関数について

CloudFormationのCidr関数、Terraformのcidrsubnet関数では、与えられたCIDR範囲からCIDR分割を行い結果を返す関数として使用できます。

そのため、今回のような、CIDR範囲が固定されている場合にとても使いやすい関数です。

使ってみた

今回は、VPCとサブネットを作成するコードを作成してみました。

CloudFormationのCIDR関数は、以下の引数で構成されています。

  • 第一引数は、第三引数のリストから、何番目のCIDR範囲を使用するか
  • 第二引数は、どのCIDR範囲を分割するか
  • 第三引数は、第二引数のCIDR範囲から何個CIDR分割するか
  • 第四引数は、第二引数のCIDRを何ビットでCIDR分割するか

main.yaml

AWSTemplateFormatVersion: "2010-09-09"
Description: "IPv6 on AWS Cidr function demo."
Resources:
    ExampleVpc:
        Type: AWS::EC2::VPC
        Properties:
            CidrBlock: "10.0.0.0/16"
            Tags:
              - Key: Name
                Value: "example-ipv6-vpc"
    IPv6CidrBlock:
      Type: AWS::EC2::VPCCidrBlock
      Properties:
          AmazonProvidedIpv6CidrBlock: true
          VpcId: !Ref ExampleVpc
    ExampleSubnet:
      Type: AWS::EC2::Subnet
      DependsOn: IPv6CidrBlock
      Properties:
          AssignIpv6AddressOnCreation: true
          CidrBlock: !Select [ 0, !Cidr [ !GetAtt ExampleVpc.CidrBlock, 1, 8 ]]
          Ipv6CidrBlock: !Select [ 0, !Cidr [ !Select [ 0, !GetAtt ExampleVpc.Ipv6CidrBlocks], 1, 64 ]]
          VpcId: !Ref ExampleVpc
          Tags:
            - Key: Name
              Value: "example-ipv6-subnet"

Terraformのcidrsubnet関数は以下の引数で構成されています。

  • 第一引数は、どのCIDR範囲を分割するか
  • 第二引数は、第一引数のCIDRから何桁単位でCIDR分割するか
  • 第三引数は、第二引数のリストから、何番目のCIDR範囲を使用するか

main.tf

resource "aws_vpc" "example" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"
  enable_dns_hostnames = true
  enable_dns_support = true

  assign_generated_ipv6_cidr_block = true

  tags = {
    Name = "example-ipv6-vpc"
  }
}

resource "aws_subnet" "example" {
  vpc_id     = aws_vpc.example.id
  cidr_block = cidrsubnet(aws_vpc.example.cidr_block, 8, 0)

  assign_ipv6_address_on_creation = true
  enable_dns64 = true
  ipv6_cidr_block = cidrsubnet(aws_vpc.example.ipv6_cidr_block, 8, 0)

  tags = {
    Name = "example-ipv6-subnet"
  }
}

分割するCIDR範囲に各関数の違いがある部分がとても面白いです。

まとめ

今回は、動的にIPv6アドレスのCIDR分割してみました。

IPv6 on AWSをIaCで行う場合は使えるtipsだと思いますので、参考にしていただけると嬉しいです。

以上、AWS事業本部コンサルティング部のたかくに(@takakuni_)でした!