CloudFormation は JSON or YAML で作成したテンプレートを元に構成を管理しています。
コメントが書ける YAML を選択している方も多いかとは思いますが、CloudFormation のテンプレートは1ファイルになっている必要があり、設定項目が多くなると管理がかなり面倒です。
JSON も YAML もそれ自体には import や require する機能はないのですが、json-refs(仕様は JSON Reference, JSON Pointer 参照)を使うと別ファイルを参照できるので、簡単にツール化してみました。
使い方
インストール
通常は、CloudFormation を使うプロジェクト内にインストールすれば OK です。
npm install -D @u-minor/cftemplate
global に入れても OK です。
CloudFormation 分割テンプレートの作成
json-refs は $ref: another_file.yml
のように、$ref
を使って別ファイルを指定します。
src/index.yml
を作成し、以下のように CloudFormation のトップレベルの要素を定義、Parameters
等の要素を別ファイルに分離します。
AWSTemplateFormatVersion: '2010-09-09'
Description: Test template
Parameters:
$ref: parameters.yml
Resources:
$ref: .resources.yml
src/parameters.yml
を作成し、テスト用のパラメータ定義をしてみます。
TestParam:
Description: Test parameter
Type: String
.resources.yml
のように「.」から始まるファイル名を指定した場合は、直接ファイルを作成せず、「.」を除いたフォルダを作成し、その中に複数の YAML ファイルを入れておくことで、自動的にマージしてくれます。
src/resources/Logs.yml
を作成し、以下のように CloudWatch の LogGroup を指定してみます。
LogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub ${AWS::StackName}/${TestParam}/
json-refs はノードに対して1ファイルを import する仕様なので、CloudFormation の Resources(1ノード)の中を複数ファイル分割しようとすると、json-refs のみでは対応できません。
ですので、この部分は独自にマージする仕様となっています。
CloudFormation テンプレートのビルド
cftemplate
コマンドで src フォルダを指定すると、ビルドされたテンプレートが標準出力にアウトプットされるので、以下のようにリダイレクトでファイルに向けます。
npx cftemplate src > stack.yml
以下のようなテンプレートが出力されれば成功です。
AWSTemplateFormatVersion: '2010-09-09'
Description: Test template
Parameters:
TestParam:
Description: Test parameter
Type: String
Resources:
LogGroup:
Type: 'AWS::Logs::LogGroup'
Properties:
LogGroupName: !Sub '${AWS::StackName}/${TestParam}/'
AWS CDK が使える今、CloudFormation テンプレートを直接管理する必要性は以前ほど少なくなってきてはいると思いますが、YAML でシンプルに定義できるメリットはまだまだあると感じています。
ぜひお試しください。