アプリケーションにおける不整合性とデータ損失を防ぐために Lambda 関数を冪等にするにはどうすればよいですか?
最終更新日: 2019-05-28
自分の AWS Lambda 関数のコードに冪等性を持たせた方がよいと聞きました。どうすればよいですか?
簡単な説明
プログラミングにおいて、冪等性 とは、繰り返されるイベントを識別し、それに応じて応答して、重複、矛盾、またはデータの損失を防ぐアプリケーションまたはコンポーネントの能力のことをいいます。
AWS Lambda 関数に 冪等性を持たせるには、重複するイベントを正しく処理するように関数論理を設計する必要があります。関数のロジックに冪等性を持たせることにより、以下を軽減できます。
- 不要な API 呼び出し
- コードの処理時間
- データの不整合
- スロットル
- レイテンシー
解決方法
関数に冪等性を持たせるには、そのコードが入力イベントを適切に検証し、そのイベントが以前に処理されたことがあるかどうかを識別しなければなりません。アプリケーションがどのように機能するかによって、これを行うための最善の方法が決まります。ガイダンスについては、以下の関数ロジックの例やベストプラクティスをご参照ください。
関数ロジックの例
この Lambda 関数ロジックの例は、ほとんどのケースに適用します。
- 入力イベントの固有属性の値を抽出します。入力イベントの固有属性の値を抽出します。
- 属性値がコントロールデータベース (Amazon DynamoDB テーブルなど) に存在するかどうかを確認します。
注: アーキテクチャに AWS サービスを追加すると、追加費用が発生する場合があります。詳細については、「Amazon DynamoDB 料金」および「 AWS 料金」をご参照ください。 - 一意の値が存在する場合 (重複イベントを示す)、実行を正常に終了します (つまりエラーを発生することがない)。一意の値が存在しない場合は、通常の実行を継続します。
- 関数の動作が正常に終了したら、コントロールデータベースにレコードが含まれます。
- 実行を終了します。
ベストプラクティス
冪等性を考慮して Lambda 関数を設計する際には、次のベストプラクティスを念頭に行ってください。
- アプリケーションを開発する前に、冪等性の実装を計画する。
- 重複イベントを処理するときは、Lambda コードが正しく終了することを確認する。エラーを発生すると、Lambda または関数を呼び出す別のサービスによって、何度も再試行が行われる可能性があります。
- 必要に応じて Lambda 関数のタイムアウト設定 を変更し、実行が完全に、正しく処理されるようにします。別のサービスを使ってデータを保持し、重複するイベントを制御するには、HTTPS エンドポイントへの API 呼び出しが必要になる場合があります。この場合、デフォルトの 3 秒よりも長い時間がかかることがあります。
- できる限り関数をテストして最適化し、実際のシナリオと要求率をシミュレートします。これは、冪等性ロジックがタイムアウト、過度のレイテンシー、ボトルネックなどの副作用を引き起こすのを防ぐために重要です。
- エスカレーションが容易でスループットが高い DynamoDB などのサービスを使用して、セッションデータを保存します。
関連情報
プログラミングモデル (AWS Lambda 開発者ガイド)