AWS Lambda
開発者ガイド

AWS Lambda 再試行動作

関数呼び出しによって、いくつかの理由でエラーが発生することがあります。コードが原因で、例外、タイムアウト、またはメモリ不足が発生する場合があります。コードを実行するランタイムによって、エラーが発生し、停止する場合があります。同時実行数がなくなり、スロットリングされる可能性があります。

エラーが発生すると、完全または部分的に実行されるか、まったく実行されないのいずれかになります。ほとんどの場合、関数を呼び出すクライアントまたはサービスは、エラーが発生すると再試行されるため、コードを実行することで、不必要な影響を及ぼすことなく同じイベントを繰り返し処理できることが必要です。関数でリソースを管理するか、データベースに書き込む場合は、同じリクエストが複数回行われるケースを処理する必要があります。

Lambda では、呼び出しのソースに応じて、次の方法で再試行を処理します。

  • ストリームベースではないイベントソース – これらのイベントソースの一部は Lambda 関数を同期的に呼び出すようにセットアップされています。それ以外は非同期呼び出しです。したがって、例外は次のように処理されます。

    • 同期呼び出し – Lambda のレスポンスの本文には、FunctionError フィールドが含まれます。この X-Amz-Function-Error ヘッダーにエラーに関する詳細を含みます。ステータスコードは、関数エラーを示す 200 です。ハンドラによるイベントの処理を妨害するリクエスト、関数、またはアクセス許可に問題がある場合は、Lambda によりエラーステータスコードが返ります。詳細については、「エラーの呼び出し」を参照してください。

      サービスに応じて、AWS のサービスのトリガーで再試行できます。アプリケーションから Lambda 関数を直接呼び出す場合は、再試行の有無を選択できます。

    • 非同期呼び出し – 非同期イベントは Lambda 関数の呼び出しに使用される前にキューされます。AWS Lambda がイベントを完全に処理できない場合、呼び出しが 2 回自動的に再試行されます (再試行間には遅延があります)。3 回の試行に失敗するリクエストをキャプチャするには、関数にデッドレターキューを設定します。

  • ストリームベースで、ポーリングベースのイベントソース – Kinesis Data Streams または DynamoDB で構成されます。Lambda 関数呼び出しが失敗した場合、AWS Lambda はデータの有効期限が切れるまで、最大 7 日間、レコードのエラーが発生したバッチを試みます。

    例外はブロックとして扱われ、失敗したレコードのバッチの有効期限が切れるか処理が成功するまで、AWS Lambda ではシャードから新しいレコードの読み込みが行われません。こうすることで、確実に AWS Lambda で順番にストリームイベントが処理されます。

  • ストリームベースでない、ポーリングベースのイベントソース – Amazon Simple Queue Service で構成されます。Amazon SQS キューをイベントソースとして設定した場合、AWS Lambda はキュー内のレコードのバッチをポーリングし、Lambda 関数を呼び出します。呼び出しが失敗、またはタイムアウトした場合、バッチのメッセージはすべてキューに返り、可視性タイムアウト期間が過ぎると処理に使用できるようになります。(可視性タイムアウトは、Amazon Simple Queue Service によって他の消費者がそのメッセージを受信および処理できなくなる期間です)。

    呼び出しによってバッチが正常に処理されると、そのバッチのメッセージはそれぞれ、キューから削除されます。メッセージが正常に処理されなかった場合は破棄されます。または、Amazon SQS デッドレターキューを設定した場合は、分析に使用する障害情報が送信されます。

順序付けられたイベントの処理を必要としない場合に Amazon SQS キューを使用する利点は、前のメッセージの呼び出しに失敗しても、AWS Lambda が新しいメッセージの処理を継続することです。つまり、新しいメッセージの処理はブロックされません。

呼び出しモードの詳細については、「AWS Lambda イベントソースマッピング」を参照してください。