![【IPv6 on AWS 】IaCでCIDR関連付けしてみた](https://devio2023-media.developers.io/wp-content/uploads/2019/11/aws-eyecatch.png)
【IPv6 on AWS 】IaCでCIDR関連付けしてみた
こんにちは!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_)でした!