LoginSignup
2
2

More than 3 years have passed since last update.

CloudFormationのYAMLを分割管理する

Last updated at Posted at 2019-12-21

CloudFormation は JSON or YAML で作成したテンプレートを元に構成を管理しています。
コメントが書ける YAML を選択している方も多いかとは思いますが、CloudFormation のテンプレートは1ファイルになっている必要があり、設定項目が多くなると管理がかなり面倒です。

JSON も YAML もそれ自体には import や require する機能はないのですが、json-refs(仕様は JSON Reference, JSON Pointer 参照)を使うと別ファイルを参照できるので、簡単にツール化してみました。

@u-minor/cftemplate - npm

使い方

インストール

通常は、CloudFormation を使うプロジェクト内にインストールすれば OK です。

npm install -D @u-minor/cftemplate

global に入れても OK です。

CloudFormation 分割テンプレートの作成

テンプレートのサンプル

json-refs$ref: another_file.yml のように、$ref を使って別ファイルを指定します。

src/index.yml を作成し、以下のように CloudFormation のトップレベルの要素を定義、Parameters 等の要素を別ファイルに分離します。

index.yml
AWSTemplateFormatVersion: '2010-09-09'
Description: Test template

Parameters:
  $ref: parameters.yml

Resources:
  $ref: .resources.yml

src/parameters.yml を作成し、テスト用のパラメータ定義をしてみます。

parameters.yml
TestParam:
  Description: Test parameter
  Type: String

.resources.yml のように「.」から始まるファイル名を指定した場合は、直接ファイルを作成せず、「.」を除いたフォルダを作成し、その中に複数の YAML ファイルを入れておくことで、自動的にマージしてくれます。

src/resources/Logs.yml を作成し、以下のように CloudWatch の LogGroup を指定してみます。

Logs.yml
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

以下のようなテンプレートが出力されれば成功です。

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 でシンプルに定義できるメリットはまだまだあると感じています。

ぜひお試しください。


2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2