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

最終更新日: 2021年11月1日

AWS Lambda 関数を設定して、Amazon Simple Queue Service (Amazon SQS) キューのメッセージを処理するようにしました。現在、有効な Amazon SQS メッセージの一部は maxReceiveCount まで複数回受信され、デッドレターキューに入ってしまいます。これが起こっているのはなぜですか? また、Lambda 関数がすべての有効な Amazon SQS メッセージを処理するようにするにはどうすればよいですか?

簡単な説明

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

有効なメッセージがデッドレターキューに入れられないようにするには、関数コードが冪等で、メッセージを複数回処理できる必要があります。

解決方法

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

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

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

ソースキューの可視性タイムアウトを関数のタイムアウトの少なくとも 6 倍に設定します。追加の時間により、前のバッチの処理中に関数がスロットルされた場合、関数はバッチの処理を再試行することができます。

詳細については、Amazon SQS デベロッパーガイドの「可視性タイムアウトの設定」を参照してください。

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

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

ソースキューのリドライブポリシーmaxReceiveCount を少なくとも 5 に設定します。関数がエラーを返す場合、または最大同時実行性のため関数を呼び出すことができない場合、処理はさらに試行されて成功する可能性があります。maxReceiveCount を少なくとも 5 に設定すると、メッセージがデッドレターキューに送信される前に処理される可能性が高くなります。

詳細については、Amazon SQS デベロッパーガイドの「デッドレターキューの仕組み」と「一貫性のないメッセージ処理を避ける」を参照してください。

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

Lambda 関数が失敗する場合のトラブルシューティング方法」の手順に従います。 関数がエラーを返さない場合にのみ、関数はキューからメッセージを自動的に削除します。


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?