CloudFormation を使用して Lambda ベースのカスタムリソースを実装するためのベストプラクティスを教えてください。

所要時間1分
0

AWS CloudFormation を使用して AWS Lambda ベースのカスタムリソースを実装するときの、ベストプラクティスに従いたいと思っています。

解決策

Lambda ベースのカスタムリソースを CloudFormation で実装する場合は、次のベストプラクティスを使用してください。

障害の報告、記録、処理を行うためのカスタムリソースを作成する

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

タイムアウトの問題を回避するには、Lambda 関数用に作成するコードに次の要素を含めてください。

  • 例外を処理するロジック
  • トラブルシューティングシナリオの障害をログに記録する機能
  • CloudFormation に HTTPS レスポンスで応答し、操作が失敗したことを確認する機能
  • 不完全な実行をキャプチャして処理できるデッドレターキュー
  • CloudFormation に応答を送信するための cfn レスポンスモジュール

適切なタイムアウト期間を設定し、超過しそうになったら報告する

定義したタイムアウト期間内に操作が実行されなかったときに、関数で例外が発生しますが、CloudFormation には応答を送信しません。

この問題を解決するには、次の手順を実行します。

  • Lambda 関数のタイムアウト値は、処理時間やネットワーク条件の変化に対応できる程度に高く設定してください。
  • 関数がタイムアウトしそうなときに CloudFormation にエラーを返すように、関数でタイマーを設定します。

イベントの作成、更新、削除を中心としたビルド

スタックアクションに応じて、CloudFormation は関数に CreateUpdateDelete イベントのいずれかを送信します。イベントはそれぞれ異なる方法で処理されるため、関数が 3 つのイベントタイプのいずれかを受け取ったときに意図しない動作が発生しないようにしてください。

詳細については、「カスタムリソースのリクエストタイプ」を参照してください。

CloudFormation がリソースを識別し、置き換える方法

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

ただし、ロールバックの可能性を考慮して、CloudFormation は古いリソースを削除しません。スタックの更新が完了すると、CloudFormation は古い物理 ID を識別子に指定し、Delete イベントリクエストを送信します。スタックの更新が失敗してロールバックが発生した場合、CloudFormation は Delete イベントで新しい物理 ID を送信します。

PhysicalResourceId を使用してリソースを一意に識別することで、関数が Delete イベントを受け取ったときに、その関数が置換時に正しいリソースのみを削除するようにします。

べき等性を考慮して関数を設計する

べき等関数は、同じ入力で何度も繰り返すことができますが、その結果は 1 回だけ実行した場合と同じになります。べき等性がある場合、再試行、更新、ロールバックによってリソースの重複が作成されたり、エラーが発生したりすることがなくなります。

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

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

スタック操作が失敗すると、CloudFormation はすべてのリソースを以前の状態に戻そうとします。このアクションの最終的な動作は、更新によってリソースが置き換えられたかどうかに左右されます。

CloudFormation がロールバックを完了できるようにするには、次の手順を実行します。

  • 関数が Delete イベントを受け取るまでは、古いリソースを暗黙的に削除しないでください。
  • ベストプラクティスに従うためには、cloudformation-accustom または、GitHub のウェブサイトにあるカスタムリソースヘルパーを使用してください。

関連情報

カスタムリソースを使用してカスタムプロビジョニングロジックを作成する

AWS公式
AWS公式更新しました 5ヶ月前
コメントはありません

関連するコンテンツ