Lambda がトリガーにより実行されてエラーが発生すると、Lambda がループのように何度も実行され続ける理由を教えてください。

2022.08.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

Lambda で DynamoDB のトリガーを設定しました。
トリガーで Lambda が実行されてエラーが発生した場合、Lambdaが何度も実行され続けています。
なぜ実行され続けるのでしょうか。

Lambda が何度も実行され続けている理由

トリガーの設定が原因です。

DynamoDB のトリガーにより Lambda が実行されてエラーが発生すると、以下のとおり再試行されます。

DynamoDB ストリームからレコードを読み取るイベントソースマッピングは、関数を同期的に呼び出し、エラー発生時に再試行します。Lambda が関数をスロットリングするか、関数を呼び出すことなくエラーを返す場合、Lambda は、レコードの期限が切れる、またはイベントソースマッピングで設定した最大経過時間を超過するまで再試行します。
関数がレコードを受信してもエラーが返された場合、バッチ内のレコードが期限切れになるか、最大経過時間を超えるか、設定された再試行クォータに達するまで、Lambda は再試行します。関数エラーの場合、失敗したバッチを 2 つのバッチに分割するように、イベントソースマッピングを構成することもできます。小さなバッチで再試行すると、不良のレコードが分離され、タイムアウトの問題が回避されます。バッチを分割しても、再試行クォータにはカウントされません。
引用元:Amazon DynamoDB で AWS Lambda を使用する

DynamoDB のトリガー設定で、以下のようにレコードの最長有効期間を-1 、再試行を-1に設定すると、 Lambda が再試行し続けます。

MaximumRecordAgeInSeconds
-1 に設定すると無制限になり、失敗したレコードはレコードの有効期限が切れるまで再試行されます。
MaximumRetryAttempts
-1 に設定すると無制限になり、失敗したレコードはレコードの有効期限が切れるまで再試行されます。
引用元:Amazon DynamoDB で AWS Lambda を使用する

再試行し続けるのを回避するには、再試行の値を変更するなど、設定値を適切な値に変更してください。

参考資料

Amazon DynamoDB で AWS Lambda を使用する