はじめに
その6でTransformによるインクルード、その8でスタックのネスト構成、その9でクロススタックリファレンスと、過去3回にわたり、別ファイル・別テンプレートを呼び出す方法を紹介してきました。
今回は今まで紹介した3つの呼び出し方法の使い分けを考察してみようと思います。
3つの方法のおさらい
以下で3つの方法をおさらいします。
Transformによるインクルード
どちらかというとLambda関数を呼び出したりするときに使うのが主なのかもしれませんが、Locationで指定したファイルを読み込み、ファイルに書かれた内容を実行できます。
テンプレート内の同じインデントレベルで複数記載はできませんが、インデントレベルが違えば複数ファイルを読み込むことができます。
スタックのネスト構成
親子関係を持ち、親テンプレートから子テンプレートを呼び出して使います。
親子間の値の引き渡しは、Parametersセクション、Outputsセクションで引き渡すことができるので、親スタックでの入力結果を子に渡したり、子スタックでの処理結果を親に渡すことが可能です。
クロススタックリファレンス
OutputsセクションのExportで記載した値を複数のスタックで共有することができます。
共有したい値だけExportで指定するので、テンプレート内・テンプレート間の構造はシンプルになります。
3つの方法の使い分け
3つのファイル呼び出し方法の特徴と、私なりの使い分け方法を以下にまとめてみました。
| 方法 | 特徴 |
|---|---|
| Transformによるインクルード | セクション内の設定単位で呼び出し可能 |
| スタックのネスト構成 | 親スタックでまとめて管理が可能 |
| クロススタックリファレンス | スタック間の繋がりをあまり意識する必要がない |
Transformによるインクルードの使い分け
Transformによるインクルードは細かい設定項目単位に記載したファイルも呼び出すことができるので、例えば案件ごと、組織ごとに共通で設定しているタグを付与したりするのに便利かと思います。
が、私が試してみた限り、ネスト構成の子スタックでインクルードするとどうしてもうまくいかなかったのでテンプレートをネスト構成で作る場合は気を付けてください。
ネスト構成の制約以外でも、リソース単位に分割するような場合はTransformだと同インデントレベルで複数ファイルをインクルードできなかったり制約があるので、Transformによるインクルードは行わずにネスト構成とするか、共有する値だけExportしてクロススタックリファレンスで組んだほうが良いと思います。
ネスト構成の使い分け
ネスト構成は親子関係があり、ネストするテンプレートは明示的に指定する必要があるので全体構成が把握しやすいです。
ただ、親で全体を管理するような形であるため、複数あるうちの1つの子スタックで変更する場合も全体が更新されるので、利用する組織が大きくなると難しいかと感じます。
クロススタックリファレンスの使い分け
クロススタックリファレンスは共有する値だけExportで記載して、使う場合もImportValueで名前を指定するだけなので、例えば元々1テンプレートで管理していたテンプレートを分割する場合など、あまり書式を変えずに簡単に分割できます。
ネスト構成とは逆に、各テンプレートはそれぞれ独立に管理することができる反面、スタック間は疎結合なので、思いがけないところでExportした値が使われていて削除できない等、発生するかもしれません。
まとめ
それぞれメリット、デメリットがあるので、例えば会社などの組織で使用する場合、組織や環境(開発環境、テスト環境など)単位でネスト構成にして、共有したい値(VPCIDやSubnetIDなど)だけクロススタックリファレンスで値を参照させるような使い方が良いかと感じます。
また、ネスト構成にしないのであれば、Transformのインクルードで各グループや案件ごとの共通タグを用意しておくのも良いかと感じます。
おわりに
それぞれの特徴を理解して使えば、使いまわししやすく構造も把握しやすいテンプレートが作成できそうだと感じました。
次回は未定ですが、いくつかあるネタを試してみたら記事にしたいと思います。
