Lambda 関数を冪等にする方法を教えてください。

所要時間1分
0

AWS Lambda 関数コードを無力化して、アプリケーションの不整合やデータ損失を防ぎたいと考えています。

簡単な説明

プログラミングにおける冪等性とは、繰り返されるイベントを識別し、データの重複、一貫性の欠如、または損失を防ぐアプリケーションやコンポーネントの機能を指します。AWS Lambda 関数を冪等にするには、重複したイベントを正しく処理できるように関数ロジックを設計する必要があります。

冪等関数ロジックは、以下の問題の軽減に役立ちます。

  • 不要な API コール
  • コード処理時間
  • データ不一致
  • スロットル
  • レイテンシー

解決策

関数を冪等にするには、関数のコードで入力イベントを適切に検証し、イベントが以前に処理されたかどうかを確認する必要があります。アプリケーションの機能によって、コードの最適な記述方法が決まります。

以下のサンプル関数ロジックとベストプラクティスを参考にしてください。

冪等 Lambda 関数ロジックの例

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

1.    入力イベントの一意の属性の値を抽出します。(たとえば、トランザクション ID や購入 ID)

2.    属性値がコントロールデータベースに存在するかどうかを確認します。(たとえば、Amazon DynamoDB テーブルなど)

3.    結果に応じて、次の手順を実行します。
一意の値が存在する場合は、エラーを発生させずにアクションを終了します。

または、

一意の値が存在しない場合は、最初に設計したアクションを続行します。

**注:**AWS サービスをアーキテクチャに追加すると、追加コストが発生する可能性があります。詳細については、「Amazon DynamoDB 料金表」と「AWS 料金表」を参照します。

4.    関数の処理が終了しても一意の値が存在しない場合は、そのレコードを制御データベースに含めます。

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

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

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

注:Amazon Elastic Compute Cloud (Amazon EC2) に API コールを行うと、サービスでパラメータ clientToken を利用できます。このパラメーターにより、同じ clientToken を使用して複数回再試行しても、変化する API リクエストでワークフローが正常に完了されるのは 1 回だけになります。


関連情報

Lambda プログラミングモデル

コンソールで Lambda 関数を作成する

冪等 API による再試行の安全性の確保

AWS公式
AWS公式更新しました 2年前