Lambda 関数が有効な Amazon SQS メッセージを再試行してデッドレターキューに入れるのはなぜですか?

所要時間1分
0

Amazon シンプルキューサービス (Amazon SQS) キュー内のメッセージを処理するように AWS Lambda 関数を設定しました。有効な Amazon SQS メッセージの中には、maxReceiveCount まで複数回受信され、デッドレターキューに入れられてしまうものがあります。

簡単な説明

Lambda 関数がスロットリングされたり、エラーが返されたり、Amazon SQS メッセージバッチを読み取ったときに応答しなかったりすると、メッセージはキューに戻ります。可視性タイムアウトが発生すると、Lambda 関数はメッセージバッチを再度受信します。関数で有効なメッセージが複数回処理されない場合、Amazon SQSはメッセージをデッドレターキューに送信します(設定されている場合)。

有効なメッセージがデッドレターキューに入れられないようにするには、関数コードが等しく、メッセージを複数回処理できる必要があります。詳細については、「Amazon SQS メッセージが Lambda 関数を複数回呼び出さないようにするにはどうすればよいですか?」を参照してください。

解像度

Lambda 関数のコードが等値であることを確認する

等性のベストプラクティスと関数ロジックの例については、「Lambda 関数を等力にするにはどうすればよいですか?」を参照してください。

Amazon SQS キューの可視性タイムアウトが Lambda 関数のタイムアウト設定の 6 倍以上長いことを確認します

ソースキューの可視性タイムアウトを、関数のタイムアウトの 6 倍以上に設定します。この余分な時間により、前のバッチの処理中に関数がスロットリングされた場合に、関数はバッチ処理を再試行できます。

詳細については、Amazon SQS 開発者ガイドの「可視性タイムアウトの設定」を参照してください。

**メモ:**キューの可視性タイムアウトが十分でないために関数がメッセージを受信しない場合、メッセージは Amazon CloudWatch ログに記録されません。

ソースキューのリドライブポリシーで maxReceiveCount 属性が少なくとも 5 に設定されていることを確認します

ソースキューの[リドライブポリシーの MaxReceiveCount](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html#sqs-dead-letter-queues-how-they-work) を 5 つ以上に設定します。関数がエラーを返す場合や、同時実行数が最大であるために呼び出せない場合は、処理がさらに試行されれば成功する可能性があります。MaxReceiveCount を 5 つ以上に設定すると、メッセージがデッドレターキューに送信される前に処理される可能性が高くなります。

最大同時実行数の設定制限を更新するには、「Amazon SQSイベントソースの最大同時実行数の設定」を参照してください

詳細については、「デッドレターキューの仕組み」を参照してください。また、Amazon SQS 開発者ガイドの「一貫性のないメッセージ処理の回避」を参照してください。

Lambda 関数でスロットリングと予約された同時実行性を確認する

Lambda 関数は、リソースやダウンストリームのアプリケーションを保護するために制限されることがあります。Lambda は受信トラフィックに合わせて自動的にスケーリングされますが、さまざまな理由で関数が調整される可能性があります。

Lambdaコンソールを使用して、予約済み同時実行の設定を確認します。予約された同時実行が設定されていない場合、この関数は予約なしの同時実行を使用します。関数による呼び出しが予約なしの同時実行数を超えると、スロットリングが発生します。

**メモ:**予約された同時実行数が 0 の関数を設定した場合、その関数はイベントを処理できないためスロットリングされます。値は必ず 0 より大きい数値に増やしてください。

同じ AWS リージョン内の他の関数が同時実行数の制限を使用している場合、スロットリングが発生する可能性があります。スロットリングが発生している Lambda 関数は、SQS メッセージをデッドレターキューに送信します。

失敗したバッチですべての SQS メッセージを再処理することは避けてください

バッチ処理中にエラーが発生した Lambda 関数では、Lambda が正常に処理したメッセージを含め、すべての SQS メッセージがデッドレターキューに表示されます。その後、Lambda は SQS メッセージのバッチ全体を再試行します。

失敗したバッチですべての SQS メッセージを再処理しないようにするには、** FunctionResponseTypes** リストの** reportBatchItemFailures** という値を使用してイベントソースマッピングを設定します。これにより、関数が部分的に成功を返し、再試行の回数を減らすことができます。詳細については、「バッチアイテムの失敗の報告」を参照してください。

Lambda 関数が返すエラーを特定して解決する

「Lambda 関数の障害をトラブルシューティングするにはどうすればよいですか?」の指示に従ってください。関数がエラーを返さない場合にのみ、キューからメッセージを自動的に削除します。

関連情報

Lambda 関数の同時実行制限の引き上げをリクエストする方法を教えてください。

「レート超過」エラーと 429 件の「ToomanyRequestsException」エラーによる Lambda 関数スロットリングをトラブルシューティングはどうすればいいですか。

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