全力で怠けたい

怠けるために全力を尽くしたいブログ。

CloudFormation の Fn::Cidr 組み込み関数の使い方のメモ。

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 ブロックが消えてすっきりするしメンテナンスもしやすくなっていい感じ。

参考ページ