AWS の CloudFormation の Fn::Cidr 関数 を使うとサブネットとかの CIDR ブロックを動的に指定することができて便利なので使い方をメモ。
Fn::Cidr 関数を使わないとき
Fn::Cidr 関数を使わないときは CIDR ブロックはベタ書きのハードコーディングする感じになる。
たとえば 10.0.0.0/16
の16ネットマスクの CIDR ブロックを VPC に割り当てて、その VPC のサブネットを2つ作ってそれぞれのサブネットは 10.0.x.0/24
の24ネットマスクの CIDR ブロックを割り当てるときはこんなテンプレートを書く感じ。
AWSTemplateFormatVersion: "2010-09-09" Description: Example of Cidr function Resources: ExampleVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 ExampleSubnet1: Type: AWS::EC2::Subnet Properties: CidrBlock: 10.0.0.0/24 VpcId: !Ref ExampleVPC ExampleSubnet2: Type: AWS::EC2::Subnet Properties: CidrBlock: 10.0.1.0/24 VpcId: !Ref ExampleVPC
別にこれでもいいんだけど VPC の CIDR ブロックが変わったりすると VPC だけじゃなくてサブネットの CIDR ブロックも変えないといけなくて面倒くさい。
Fn::Cidr 関数を使うとき
Fn::Cidr 関数を使うと CIDR ブロックはベタ書きのハードコーディングしなくていい。
たとえば 10.0.0.0/16
の16ネットマスクの CIDR ブロックを VPC に割り当てて、その VPC のサブネットを2つ作ってそれぞれのサブネットは 10.0.x.0/24
の24ネットマスクの CIDR ブロックを割り当てるときはこんなテンプレートを書く感じ。
サブネットの CIDR ブロックのところがベタ書きじゃなくなっているのが分かると思う。
AWSTemplateFormatVersion: "2010-09-09" Description: Example of Cidr function Resources: ExampleVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 ExampleSubnet1: Type: AWS::EC2::Subnet Properties: CidrBlock: !Select [0, !Cidr [!GetAtt ExampleVPC.CidrBlock, 2, 8]] VpcId: !Ref ExampleVPC ExampleSubnet2: Type: AWS::EC2::Subnet Properties: CidrBlock: !Select [1, !Cidr [!GetAtt ExampleVPC.CidrBlock, 2, 8]] VpcId: !Ref ExampleVPC
でも、さっきよりはいい感じなんだけど VPC の CIDR ブロックが変わったりすると VPC の CIDR ブロックのところを変えないといけないのが面倒くさい。
なので、実際の開発では VPC の CIDR ブロックは↓みたいにパラメーターにしてテンプレート外部からもらうのがよさそう。
AWSTemplateFormatVersion: "2010-09-09" Description: Example of Cidr function Parameters: VPCCidrBlock: Type: String Default: 10.0.0.0/16 Resources: ExampleVPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VPCCidrBlock ExampleSubnet1: Type: AWS::EC2::Subnet Properties: CidrBlock: !Select [0, !Cidr [!GetAtt ExampleVPC.CidrBlock, 2, 8]] VpcId: !Ref ExampleVPC ExampleSubnet2: Type: AWS::EC2::Subnet Properties: CidrBlock: !Select [1, !Cidr [!GetAtt ExampleVPC.CidrBlock, 2, 8]] VpcId: !Ref ExampleVPC
CIDR ブロックはパラメーターにしてテンプレート外部からもらうと Resources
セクションのベタ書きの CIDR ブロックが消えてすっきりするしメンテナンスもしやすくなっていい感じ。