CloudFormation で VPC プレフィックスリスト(PrefixList) を作成してみた

2020.07.15

AWS事業本部、福岡オフィスの梶原です。 先日のAWSのアップデートでVPCに複数のCIDRブロックをまとめたプレフィックスリストを作成し、SecurityGroupやRouteTableで使用することが可能になりました。
便利に使えるのですが、CloudFormationで管理したくなったので、さっくり作ってみました。
サンプルとして、プライベートIPアドレス (Class A, B, C) でCloudFormationテンプレートを作ってみましたので、共有します。
内容を変更しご自由にご活用ください

注意事項

  • CloudFormationの入力パラメータで更新可能なテンプレートにしていますが、最大エントリ数、アドレスファミリー(IPv4|IPv6)は作成時に指定したものから変更できませんのでご注意ください
  • アドレスブロックは5つまでパラメータで設定可能にしていますが、6つ以上入力指定したい場合は適時編集しパラメータを追加してください。(CidrBlockXXXの部分)
  • 最大エントリ数と入力したCIDRブロックの数は一致する必要はなく、後から追加することも可能です。(作成時に指定した最大エントリ数まで)

テンプレート

AWSTemplateFormatVersion: 2010-09-09
Description: Create VPC Prefixlist
Metadata: 
  AWS::CloudFormation::Interface: 
    ParameterGroups: 
      - Parameters: 
          - PrefixListName
          - AddressFamily
          - MaxEntries
          - CidrBlock1
          - CidrBlock2
          - CidrBlock3
          - CidrBlock4
          - CidrBlock5
          
Parameters:
  PrefixListName:
    Type: String
    Default: PrivateIPAddresses
    Description: A name for the prefix list. The name cannot start with com.amazonaws.
  AddressFamily:
    Type: String
    Default: IPv4
    AllowedValues: [IPv4,IPv6]
    Description: The IP address type.  AddressFamily is not updatable. 
  MaxEntries:
    Type: Number
    Default: 10
    MinValue: 1
    MaxValue: 1000
    Description: The maximum number of entries for the prefix list. MaxEntries is not updatable. 
  CidrBlock1:
    Type: String
    Default: "10.0.0.0/8"
    Description: The CIDR blocks
  CidrBlock2:
    Type: String
    Default: "172.16.0.0/12"
    Description: The CIDR blocks
  CidrBlock3:
    Type: String
    Default: "192.168.0.0/16"
    Description: The CIDR blocks
  CidrBlock4:
    Type: String
    Default: ""
    Description: The CIDR blocks
  CidrBlock5:
    Type: String
    Default: ""
    Description: The CIDR blocks

Conditions:
  IsEmpty1: !Equals [ !Ref CidrBlock1, '' ]
  IsEmpty2: !Equals [ !Ref CidrBlock2, '' ]
  IsEmpty3: !Equals [ !Ref CidrBlock3, '' ]
  IsEmpty4: !Equals [ !Ref CidrBlock4, '' ]
  IsEmpty5: !Equals [ !Ref CidrBlock5, '' ]

Resources:
  PrivateAddressPrefixList:
    Type: AWS::EC2::PrefixList
    Properties: 
      AddressFamily: !Ref AddressFamily
      Entries:
        - !If [IsEmpty1, !Ref "AWS::NoValue", Cidr: !Ref CidrBlock1]
        - !If [IsEmpty2, !Ref "AWS::NoValue", Cidr: !Ref CidrBlock2]
        - !If [IsEmpty3, !Ref "AWS::NoValue", Cidr: !Ref CidrBlock3]
        - !If [IsEmpty4, !Ref "AWS::NoValue", Cidr: !Ref CidrBlock4]
        - !If [IsEmpty5, !Ref "AWS::NoValue", Cidr: !Ref CidrBlock5]
      MaxEntries: !Ref MaxEntries
      PrefixListName: !Ref PrefixListName

作成結果

参考情報

[アップデート] 複数のCIDRをまとめて管理!Amazon VPC で プレフィックスリストが利用可能になりました

CloudFormation AWS::EC2::PrefixList https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html

AWS > Documentation > Amazon EC2 > API Reference CreateManagedPrefixList https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateManagedPrefixList.html