AWS CloudFormation で一つのテンプレートから n 個の環境を一気につくる

一つのテンプレートからパラメーターだけ変えて n 個の環境をつくりたい、という場合、手作業で一つずつスタックをつくるのはしんどい。一気につくれる方法があったのでまとめる。

サマリー

作り方

  • 1: ベースとなるテンプレを S3 にアップ
  • 2: AWS::CloudFormation::Stack リソースを定義する
    • Parameter と TemplateURL を与える感じ

つまり AWS::CloudFormation::Stack は「このテンプレにこのパラメーターを与えてスタックつくれ」というリソースになる。仮に n 個分の環境がつくりたいなら、このリソースの定義を n 個分書き並べればいい

所感

  • めちゃくちゃ楽できる
    • 仮に 50 個の SecurityGroup を作る場合
    • 手作業なら 1H はかかる
    • この方法なら数分でつくれる(最初に n 個の定義を並べたテンプレを作る必要はあるが)
  • n 個定義を手作業コピペでつくるのがだるいならプログラミングで頑張る
    • 複数行文字列と書式指定が使える扱える言語が良い
    • 私は Python 使った

スクリプト例

ここではテストとして VPC の中に SecurityGroup をつくるだけのテンプレを用意し、これを使って n 個の SecurityGroup を一気につくろうとしている。各 SecurityGroup は Name タグで区別する。

こんな感じ。

  • a) あらかじめ VPC を一つつくっておく
  • b) ベースとなるテンプレ → SecurityGroup を一つつくるテンプレ
  • c) n 個つくるテンプレ → b) をベースにした定義を n 個並べたテンプレ

c) は以下のようなイメージになる。

Parameters:
  VpcId:
    Description: VPC ID
    Default: vpc-XXXXXXXXXXXXXXXXX
    Type: String
  TemplateURL:
    Description: base template URL.
    Default: https://s3.amazonaws.com/(TEMPLATE-URL)
    Type: String

Resources:
  Stack01:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Ref TemplateURL
      Parameters:
        VpcId: !Ref VpcId
        NameTagSuffix: "01"

  Stack02:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Ref TemplateURL
      Parameters:
        VpcId: !Ref VpcId
        NameTagSuffix: "02"

  # ...

用語

ルートスタック

管理コンソール上から作成したスタック。大元のスタック。

上記で言えば c)。

ネストされたスタック

AWS::CloudFormation::Stack でつくられたスタックのこと。

上記で言えば Stack01, Stack02 ……。

運用時の注意点

  • スタック更新時は常にルートスタックから行うようにする
    • 上記で言えば c) のテンプレートを修正してから再アップする

参考