CloudFormationテンプレートをすばやく効果的にデバッグするにはどうすればよいですか?


82

CloudFormationは、次のようなAWSリソーススタック、のプログラムを作成できる強力なAWSの提供であるアプリケーションのWeb層、ハイパフォーマンスコンピューティングクラスタ、または、アプリケーション全体のスタックを単一のAPI呼び出しで。それは非常に強力です。これを使用することは、特にChef、 Puppet、またはcloud-initと組み合わせた場合に、AWSの優れたプラクティスと見なされます。それをデバッグすることは私を悪に駆り立てます。

本番環境の例を見てみましょう。ストックのmongodbクラスターテンプレートは機能しません。理由は特にわかりません。ほとんどいつものように、それは単純なものだと確信しています。私の問題は、何が悪いのか理解できないということではありません。スタックが失敗するまでに20〜30分かかり、リソースが適切に削除されると仮定すると、削除するのにさらに3〜4分かかります。

何が足りないのですか?私は--disable-rollback旗について知っていて、酸素のようにそれを使います。私はずっと前に、出口メッセージを包みcfn-signal、沈没船からバラストのように投げ出すことを学びました。テンプレートのデバッグプロセスを高速化するにはどうすればよいですか、または間違いを犯してから30分後に間違いに気づき続けるのですか?


3
JSONのタイプミスでさえ、特定のリソースタイプがそのリソースを開始しようとするまで特定の属性名を持たないことに気付かないため、ビルドプロセスの10分以上経過するまでキャッチされないことがあります。
エリックハモンド

1
私のお気に入りは順不同です。リソースコンテキスト切り替えて、ほとんど同じではない属性に遭遇したとき、ユーザースクリプト宣言内にエスケープされた引用符を追加するのを忘れたとき、およびVolumeAttachmentsに関係することは、次の場合に失敗することがあります。理由はまったくありません。
クリストファー

1
「自動ロールバックの無効化」について言及した場合は+ 1-これは、サブスタックのエラーメッセージを改善するのに最適でした
izikandrw

1
ポリシーセグメントに誤りがあると、BucketPolicyなどがCREATEステージで永久にスタックすることがわかりました。何かがCREATEステージでスタックしている場合は、そこから開始します。
Eric Nord

回答:


46

aws cloudformation validate-templateAWSCLIツールでコマンドを使用します。テンプレートが有効なJSONまたはYAMLであるかどうかのみを検証し、キーと値が正しいかどうかは検証しません(たとえば、キーのタイプミスをチェックしません)



7
ちなみに、これはaws cloudformation validate-template新しいAWSCLIツールにあります。
クリストファー

8
2017年以降にこの質問に出くわした人にとって、これは現在です。これはaws cloudformation validate-template、テンプレートが有効なJSONまたはYAMLであるかどうかのみを検証し、キーと値が正しいかどうかは検証しません(たとえば、キーのタイプミスをチェックしません)。
ダニエルキャッツ2017年

1
何らかの理由で、行の長さを無視しているようProperty validation failure: [Length of value {XYZ} for property {/RepositoryDescription} is greater than maximum allowed length {100}]です。validate-templateコマンドによると、これは問題ではありませんでしたが、UIはこのエラーを返します。
030

2
このツールがファイル形式の検証のみを行う場合はそうではありません。jsonlintまたはyamllintで十分ですか?また、このツールには、51,200バイトのファイルサイズの制限があります。
SivaSenthil19年

23

1年後の別のオプションは、これらのテンプレートをtroposphereなどのサードパーティライブラリに抽象化することです。そのライブラリはJSONペイロードを構築し、その過程で多くの検証を行います。これにより、「1000行のJSONファイルを管理するのは確かに悲しい」という問題も解決されます


3
「1000行のJSONファイルを管理するのは確かに悲しいことです」-確かにこれがネストされたスタックが作成された理由ですか?;-)私は同意しますが-対流圏はひどいです-いくつか!
YFP 2014

10

テンプレートのデバッグプロセスを高速化するにはどうすればよいですか、または間違いを犯してから30分後に間違いに気づき続けるのですか?

複雑なCloudFormationテンプレート開発の反復速度の向上に特に焦点を当てた、いくつかのベストプラクティスの提案を次に示します。

CloudFormationツールを使用して、テンプレートとスタックの更新を検証します

AWSは、独自のベストプラクティスドキュメントでこれらの概要をすでに説明しているため、繰り返しません。

このステップのポイントは、スタックの作成/更新を実際に実行する前に、明らかな構文エラーまたは論理エラーをキャッチすることです。

リソースを分離してテストする

複雑なスタックで個々のCloudFormationリソースを使用する前に、より小さなスタンドアロンスタックで動作をテストすることにより、使用量の制限や通常の起動/破棄時間など、リソースの作成/更新/削除動作の全範囲を完全に理解してください。最初。

  • サードパーティのカスタムリソースを開発または使用している場合は、言語プラットフォームに適したライブラリを使用して単体テストを記述し、アプリケーションロジックがすべてのユースケースで期待どおりに動作することを確認します。
  • 個々のリソースが作成/更新/削除する時間は、基になるAPI呼び出しの動作に応じて、リソースタイプ間で大きく異なる可能性があることに注意してください。たとえば、複雑なAWS::CloudFront::Distributionリソースの作成/更新/削除には30〜60分かかる場合がありAWS::EC2::SecurityGroupますが、更新には数秒かかる場合があります。
  • 個々のリソースには、実装にバグ/問題/制限がある場合があります。これは、はるかに大きなスタック内ではなく、単独でテストした場合のデバッグと回避策の開発がはるかに簡単です。個々のAWSアカウント設定に応じたAWSサービス制限、またはスタックを作成するリージョンに応じたサービスのリージョン可用性などの制限に注意してください。

複雑なスタックを少しずつ構築する

スタックの作成/更新を実行するときに、単一のリソースで障害が発生すると、スタックはリソース変更のセット全体をロールバックします。これにより、正常に作成された他のリソースが不必要に破壊され、長い複雑なスタックを構築するときに非常に長い時間がかかる可能性があります。関連するリソースの依存関係グラフ。

これに対する解決策は、スタックを小さな更新バッチで段階的に構築し、一度に1つ(またはいくつか)のリソースを追加することです。このように、リソースの作成/更新で障害が発生した場合、ロールバックによってスタックのリソース全体が破棄されることはなく、最新の更新で変更されたリソースのセットのみが破棄されます。

スタック更新の進行状況を監視する

作成/更新の実行中にスタックのイベントを表示して、スタック更新の進行状況を必ず監視してください。これは、個々のリソースに関するさらなる問題をデバッグするための開始点になります。


CloudFrontとその所要時間について、スタックが完了状態になるのを待たずに知っていますか?出力を取得したいのですが、私の場合はディストリビューションがデプロイされるのを待つ必要はありません
mcfedr

9

AWS Toolkit forEclipseに含まれているAWSCloudFormationテンプレートエディターを見たことがあり ますか?シンタックスハイライト、ステートメントの完了、AWSCloudFormationへのデプロイがあります。


6
「AWSToolkitforVisualStudio」は私にとって不可欠です。
エド・ノリス

5

パーティーに遅れましたが、エディターの構成と学習に少し時間を費やす価値があることも付け加えておきます。答えとしては笑えるほど基本的に聞こえるかもしれませんが、試してみてください。

私の場合、vimを使用すると、json構文プラグインのインストールに時間をかけると、パフォーマンスが大幅に向上し、(最終的に)大きなCFファイルを簡単にナビゲートするための折りたたみテクニックも理解しました。私は今、タイプミス(あるべきではないコンマなど)を提案し、色の強調表示は明確な視覚的手がかりを与えるために多くの時間を節約します。

これは構文エラーを軽減するのに役立つかもしれませんが、テンプレート内の論理エラーは他のツールによってより適切に修正されます。うまくいけば、いつかCFに「プレビュー」モードがあります。


1
笑える提案ではありません。構文を強調表示せずにコーディングできるかどうかはわかりません。
クリストファー

2
作成しようとしているすべてのリソースを表示するCFNのプレビューがあり、スタックのコストもわかります。私は
JavaAPIを

4

JetBrains IDE(IntelliJ IDEA PhpStorm WebStorm PyCharm RubyMine AppCode CLion Gogland DataGrip Rider Android Studio)の場合、JSONおよびYAMLCFNテンプレートの詳細なチェックをサポートするAWSCloudFormationプラグインがあります


4

リンターAWS CloudFormation追加の静的解析を超えを提供aws cloudformation validate-template

特定のリージョンで使用できないリソースタイプとインスタンスタイプを通知し、許可された値に対してプロパティ値を検証し、循環リソースの依存関係、構文エラー、テンプレート制限などをキャッチします。

CLIに加えて、リンターを実行することを忘れないで最も一般的なメカニズムの1つは、すべてのファイル保存で実行されるVisual StudioCode拡張機能のようなエディタープラグインをインストールすることです。

事前コミットGitフックのような他のメカニズムはここで説明されています

Visual StudioCode拡張機能のスクリーンショットの例


2

EC2マシンを扱っている場合は、EC2マシンにログインして、boot.logファイル(RHEL6 / Centosの/var/log/boot.log)を末尾に追加することをお勧めします。このファイルは、すべてのシェルアクティビティ(インストール、ファイルのダウンロード、ファイルのコピーなどのアクティビティ)で更新されます。

また、http: //www.jsoneditoronline.org/のようなエディターを使用してください、JSONのTREE表現を取得します。これは、JSON要素の順序を確認するのに役立ちます。

また、ファイルを更新するときは、常にhttp://www.git-tower.com/blog/diff-tools-mac/などのツールまたは実際のバージョン管理システムを使用して、スクリプトを壊す可能性のあるものを誤って変更していないことを確認してください。



1

昨年12月にCloudformationに追加された最近の新機能は、追加のパラメータータイプの追加でした。これらの新しいタイプにより、テンプレートはより強力なデータチェックを実行でき、リソースやネストされたCloudformationスタックを作成するときに「フェイルファスト」することもできます。新しいConstraintDescription属性を使用して無効な値が渡された場合に、人間が読める形式のカスタムエラーメッセージを提供することもできます。

新しいタイプは、さまざまなVPCリソースを処理するときに特に役立ちます。テンプレートのパラメーターが正しいタイプであり、リストに対して単一の値を期待することについて明示的であることを確認できます。

例えば:

"Parameters" : {
  "SingleGroup": { "Type": "AWS::EC2::SecurityGroup::Id", ...},
  "GroupList": {"Type": "List<AWS::EC2::SecurityGroup::Id>", ...}
}


0

こちらのAmazonから入手できるCloudFormationDesignerを利用することもできます。 https -1

テンプレート(JSON)を[テンプレート]ペインに貼り付けてから、チェックマークをクリックしてテンプレートを検証します。エラーはすべて[エラー]ペインに表示されます。

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.