AWS CloudFormation を使用して AWS Lambda-backed カスタム リソースを実装するためのベストプラクティスは何ですか?

最終更新日: 2019 年 6 月 28 日

AWS CloudFormation を使用して AWS Lambda-backed カスタム リソースを実装するためのベストプラクティスは何ですか?

解決方法

次のベストプラクティスを検討してください。

障害を適切に報告、記録、および処理するためのカスタムリソースを構築する

例外が発生すると、応答を送信せずに機能コードが終了する可能性があります。AWS CloudFormation では、操作が成功したか失敗したかを確認するために HTTPS 応答が必要です。報告されない例外が発生すると、AWS CloudFormation はスタックロールバックを開始する前に操作がタイムアウトするまで待機します。ロールバック時に例外が再度発生した場合、AWS CloudFormation はロールバックの失敗を終了する前にタイムアウトを再度待機します。この間、スタックは使用できません。

トラブルシューティングに時間がかかる可能性があるタイムアウトの問題を回避するには、Lambda 関数用に作成したコードに以下を含めてください。

  • 例外を処理するためのロジック
  • トラブルシューティングシナリオのために失敗を記録する機能
  • 操作が失敗したことを確認する HTTPS 応答で AWS CloudFormation に応答する機能
  • 未完了の実行を取得して処理できるデッドレターキュー

妥当なタイムアウト期間を設定し、それらが超過しそうな時に報告する

オペレーションが定義されたタイムアウト期間内に実行されない場合、関数は例外を発生させ、AWS CloudFormation に応答は送信されません。

この問題を回避するには、次の点を考慮してください。

  • Lambda 関数のタイムアウト値を、処理時間とネットワーク状態の変動に対処するのに十分な大きさに設定します。
  • 関数がタイムアウトしようとしているときにエラーで AWS CloudFormation に応答するには、関数にタイマーを設定します。タイマーは、カスタムリソースの遅延を防ぐのに役立ちます。

Create、Update、Delete の各イベントを理解して構築する

スタックアクションに応じて、AWS CloudFormation は関数に 作成更新、または削除のイベントを送信します。各イベントは異なる方法で処理されるため、3 つのイベントタイプのいずれかを受信したときに意図しない動作がないことを確認してください。

詳しくは、「カスタム・リソース要求タイプ」を参照してください。

AWS CloudFormation がリソースを識別して置き換える方法を理解する

更新によって物理リソースの置き換えがトリガーされると、AWS CloudFormation は Lambda 関数によって返された PhysicalResourceId を以前の PhysicalResourceId と比較します。ID が異なる場合、AWS CloudFormation はリソースが新しい物理リソースに置き換えられたと見なします。

ただし、必要に応じてロールバックを許可するために古いリソースが暗黙的に削除されることはありません。スタックの更新が正常に完了すると、古い物理 ID を識別子として Delete イベントリクエストが送信されます。スタックの更新が失敗してロールバックが発生した場合、新しい物理 ID が削除イベントで送信されます。

新しい PhysicalResourceId を返す場合は慎重に検討してください。PhysicalResourceId を使用してリソースを一意に識別し、Delete イベントを受信したときに置換更新中に正しいリソースのみが削除されるようにします。

冪等性を念頭に置いて関数を設計する

べき等関数は同じ入力で何回でも繰り返すことができ、結果は 1 回だけ行ったのと同じになります。AWS CloudFormation を使用して再試行、更新、およびロールバックを行ってもリソースが重複したり、エラーが発生したりしないようにするために、冪等性は重要です。

たとえば、AWS CloudFormation が関数を呼び出してリソースを作成したが、リソースが正常に作成されたという応答を受け取らなかったとします。AWS CloudFormation は関数を再度呼び出して 2 番目のリソースを作成する可能性があります。最初のリソースが孤立する可能性があります。

ロールバックを正しく処理するようにハンドラーを実装する

スタック操作が失敗した場合、AWS CloudFormation はすべてのリソースをロールバックして以前の状態に戻そうとします。これにより、更新によってリソースが置き換えられたかどうかによって、動作が異なります。

ロールバックが円滑に実行されるようにするために、以下の点を考慮してください。

  • Delete イベントを受信するまで、古いリソースを暗黙的に削除することは避けてください。
  • AWS CloudFormation でカスタムリソースを使用するときにベストプラクティスに従うのに役立つように、アカウントまたはカスタムリソースヘルパーを使用してください。

この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合