web-dev-qa-db-ja.com

AWSクラウドフォーメーション:1つの大きなテンプレートファイルまたは多くの小さなテンプレートファイル?

Botoで各要素を独自に起動するのではなく、botoで制御されるクラウドフォーメーションですべてを起動するように多くのawsデプロイメントコードを書き直そうとしています。すべてを一緒に開始する1つの巨大なテンプレートファイルを使用するのが「ベストプラクティス」なのか、それとも多くの小さなファイルを使用するのかを誰かが知っていますか?

1つの巨大なものの利点は、AWSがすべての依存関係を処理するため、処理が少し速くなることです。明らかな欠点は、維持するのが悪夢のように見えることです。

実行時にテンプレートファイルを組み合わせて1つの大きなファイルとして扱われるようにしようとした人はいますか、それとも保守が難しくなりますか?

21
TristanMatthews

簡単な答えはありませんが、覚えておくべきいくつかの重要なポイントがあります。

  • 複数の小さなテンプレートを作成する場合は、小さなテンプレート(ネストされたスタック)を呼び出すマスターテンプレートを作成します。小さいものを更新したい場合は、ファイルを変更してマスターのものを更新してください。変更されたリソースのみが更新され、スタック更新の結果はアトミックになります(すべてクリアまたはすべてをロールバックします)。 CloudFormationは引き続きネストされたスタックを並列に実行するため、それほど遅くはありません

  • cloudFormationには、リソースの数(スタックあたり200リソース)に関する制限があります。たとえば、SecurityGroupIngress/Egressルールがある場合は、簡単にアクセスできます。この制限がサポートによって更新できるかどうかはわかりません。

  • 一方、ネストされたスタックにパラメータをフィードすると、情報がそれほど多くない大きなファイルが生成される可能性があります...これを考慮してください。ネストされたスタック内ですべてのパラメータを再度宣言する必要があります。 2つのレベルの入れ子は本当に苦痛です、私を信じてください!

私が見つけた最善の解決策は、CloudFormationテンプレートフロントエンド(Pythonでは troposphere -を使用)を使用することです。これにより、コードのすべての利点(ループ、条件、外部)を備えたインフラストラクチャをコードとして実際に記述できます。ファイル、関数)そして最終的に、あなたは本物のCloudFormationテンプレートを手に入れました。

メンテナンスの悪夢なしに、このシステムで巨大なCloudFormationテンプレートを作成することができました...

14
huelbois

最初はすべてを1つの大きなテンプレートに入れましたが、最終的には少しリファクタリングして、他のテンプレートに重複しないように、いくつかのリソースを含むネストされたスタックを含めました。

私が見つけた最大の課題の1つは、モノリシックスタックを使用すると、更新が少しずつ難しくなり、モノリス内のリソースに依存する他のスタック(セキュリティグループなど)がある場合に厄介になることです。

Re:Invent 2014で、いくつかの役立つヒントを含むセッションがありました。APP304-AWSCloudFormationのベストプラクティス。 スライド / ビデオ

ID、ベースネットワーク、共有サービス、バックエンドサービス、フロントエンドサービスなど、レイヤーまたは共有ビットの組み合わせに基づいてスタックを分割することをお勧めします。

私は多くのパラメーターと出力を処理するのが嫌いですが(スタック間でそれらをフィードするのは面倒です)、必要なインフラストラクチャを構成するためのより柔軟な方法のようです。

6
kylesm

このディスカッションに遅れていることはわかっていますが、共有したいと思います cfpack.js CLIツールを使用すると、複数の小さなCloudFormationテンプレートを作成して、大きなテンプレートに結合し、CloudFormationスタックにデプロイできます。

1
Eugene Manuilov

これに関する公式のガイダンスについてはよくわかりませんが、CloudFormationパスを使用する場合は、スタック全体を1つのテンプレートにまとめることが理にかなっていると思います。そうすることで、おっしゃるように、CloudFormationのトランザクションの性質が機能し、スタック全体が作成されるかどうかが決まります。

0
garnaat