
【IPv6 on AWS 】IaCでCIDR関連付けしてみた
この記事は公開されてから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分割するか
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範囲を使用するか
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_)でした!












