Lambda 関数を冪等にするにはどうすればよいですか?

最終更新日: 2022 年 08 月 05 日

AWS Lambda 関数のコードを冪等にして、アプリケーションの不整合やデータの損失を防いだ方がよいと聞きました。どうすればよいですか?

簡単な説明

プログラミングにおいて、冪等性とは、イベントの 繰り返しを識別し、データの重複、矛盾、損失を防ぐアプリケーションまたはコンポーネントの能力のことをいいます。AWS Lambda 関数を冪等にするには、重複するイベントを正しく処理するように関数ロジックを設計する必要があります。

関数ロジックを冪等にすると、次のような問題を減らすのに役立ちます。

  • 不要な API 呼び出し
  • コードの処理時間
  • データの不整合
  • スロットル
  • レイテンシー

解決方法

関数を冪等にするには、関数のコードによって、入力イベントを適切に検証し、そのイベントが以前に処理されたことがあるかどうかを識別する必要があります。アプリケーションの動作によって、最善のコードの書き方が決まります。

ガイダンスとして、以下の関数ロジックの例やベストプラクティスをご使用ください。

冪等 Lambda 関数ロジックの例

注: 次の Lambda 関数ロジックの例は、ほとんどのユースケースに適用されます。

1.    入力イベントの固有属性の値を抽出します。(例えば、 トランザクション ID または購入 ID など。)

2.    属性値がコントロールデータベースに存在するかどうかを確認します。(例えば、Amazon DynamoDB テーブルなど)。 次に、結果に応じて以下を実行します。
固有の値が存在する場合は、エラーを生成せずにアクションを終了します。

- または -

固有の値が存在しない場合は、元々設計してあるアクションに進みます。

注: アーキテクチャに AWS サービスを追加すると、追加費用が発生する場合があります。詳細については、「Amazon DynamoDB 料金」および「AWS 料金」をご参照ください。

3.    関数の作業終了後に一意の値が存在しない場合は、そのレコードをコントロールデータベースに含めます。

4.    アクションを終了します。
注: 関数に Java または Python ランタイムを使用している場合は、Python およびJava の Lambda Powertools ライブラリの冪等性モジュールを確認してください。

Lambda 関数の冪等性のベストプラクティス

  • アプリケーションを開発する前に、冪等性の実装を計画します。
  • Lambda コードは、重複イベントを処理するときにエラーを生成せずに終了するようにしてください。
    注: エラーを発生させると、Lambda や関数を呼び出す他のサービスが、試行を何度も繰り返す可能性があります。
  • 必要に応じて Lambda 関数のタイムアウト設定を変更し、ランタイム全体が正しく処理されるようにします。
    注: 別のサービスを使ってデータを保持し、重複するイベントを制御するには、HTTPS エンドポイントへの API 呼び出しが必要になる場合があります。HTTPS エンドポイントへの API 呼び出しでは、デフォルトの 3 秒よりも多くのランタイムが必要になる場合があります。
  • できる限り関数をテストして最適化し、実際のシナリオと要求率をシミュレートします。
    注: 冪等関数ロジックのテストと最適化は、タイムアウト、過度の遅延、ボトルネックなどの潜在的な副作用を防ぐために重要です。
  • スケーリングが容易でスループットが高い DynamoDB などのサービスを使用して、セッションデータを保存します。

注: Amazon Elastic Compute Cloud (Amazon EC2) への API 呼び出しを行う場合、このサービスで clientToken パラメータが提供されます。clientToken を使用すると、API リクエストが再試行された場合にのみ、変更 API リクエストが 1 回実行されるようにできます。