AWS Lambda 関数コードを無力化して、アプリケーションの不整合やデータ損失を防ぎたいと考えています。
簡単な説明
AWS Lambda 関数をべき等にするには、重複するイベントを正しく処理する関数ロジックを設計する必要があります。関数のコードが、入力イベントを適切に検証し、イベントが以前に処理されたかどうかを識別する必要があります。アプリケーションの機能によって、コードの最適な記述方法が決まります。
べき等関数ロジックにより、次の問題を軽減することができます。
- 不要な API コール
- コード処理時間
- データ不一致
- スロットル
- レイテンシー
解決策
次の関数ロジック例とベストプラクティスは、ほとんどの使用方法に適用されます。
べき等 Lambda 関数ロジックの例
べき等 Lambda 関数を使用するには、次の手順を実行します。
- トランザクション ID や購入 ID など、入力されたイベントの一意の属性の値を抽出します。
- 条件式を使用して Amazon DynamoDB テーブル にべき等キーを入力します。
- レコード属性に対し、次のアクションを実行します。
Status を IN_PROGRESS に設定します。
in_progress_expiry timestamp で、現在のタイムスタンプ (ミリ秒単位) + 実行がタイムアウトするまでの残りミリ秒数を選択します。Python の場合は、context.get_remaining_time_in_millis を使用します。
注: in_progress_expiry により、Lambda 関数は安全にロジックを再試行できます。
前のステップにおいて、PutItem が ConditionalCheckFailedException を返す場合は、べき等キーが処理中です。
idempotent_expiry で DynamoDB Time To Live (TTL) 属性を使用するには、その属性を値の後の時間に設定します。
- キーレコードのステータスを COMPLETE に更新します。
- アクションを完了させます。
注: AWS サービスをアーキテクチャに追加すると、追加コストが発生する可能性があります。詳細については、「Amazon DynamoDB 料金表」と「AWS 料金表」を参照してください。
Lambda 関数のべき等性に関するベストプラクティス
次のベストプラクティスを導入します。
- アプリケーションを開発する前に、べき等性機能を計画します。
- Lambda コードが重複したイベントを処理する場合に、エラーを発生させずに終了するようにします。
注: プロセスがエラーで終了すると、関数を呼び出すサービスがさらに再試行される可能性があります。
- Lambda 関数のタイムアウト設定を構成し、ランタイム全体が正しく処理されるようにします。
注: 別のサービスを使用してデータを永続化し、重複イベントを制御する場合、HTTPS エンドポイントへの API コールが必要になることがあります。HTTPS エンドポイントへの API コールには、デフォルトの 3 秒よりも長いランタイムが必要になる場合があります。
- 機能のテストと最適化を、可能な限り実施してください。実際のシナリオとリクエスト率をシミュレートします。
注: 起こりうるタイムアウト、過度の遅延、ボトルネックなどを防ぐには、べき等関数ロジックをテストして最適化する必要があります。
- DynamoDB など、スケーリングが容易でスループットが高いサービスを使用してセッションデータを保存します。
注: Amazon Elastic Compute Cloud (Amazon EC2) に API コールを行う際、clientToken パラメータを使用できます。このパラメータを使用すると、同じ clientToken を使用して複数回再試行しても、変化する API リクエストでワークフローが正常に完了されるのは 1 回だけになります。
関連情報
Lambda プログラミングモデルを理解する
コンソールで Lambda 関数を作成する
冪等 API による再試行の安全性の確保