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) のテンプレートを修正してから再アップする