AWS Lambda 関数を設定して、Amazon Simple Queue Service (Amazon SQS) キューのメッセージを処理するようにしました。現在、有効な Amazon SQS メッセージの一部は maxReceiveCount まで複数回受信され、デッドレターキューに入ってしまいます。これが起こっているのはなぜですか? また、Lambda 関数がすべての有効な Amazon SQS メッセージを処理するようにするにはどうすればよいですか?
Lambda 関数がスロットルされている、エラーを返す、または Amazon SQS メッセージバッチを読み取るときに応答しない場合、メッセージはキューに戻ります。可視性タイムアウトが発生すると、Lambda 関数はメッセージバッチを再度受信します。関数が有効なメッセージを複数回処理できない場合、Amazon SQS はメッセージをデッドレターキューが設定されていれば、それに送信します。
有効なメッセージがデッドレターキューに入れられないようにするには、関数コードが冪等で、メッセージを複数回処理できる必要があります。詳細については、「Amazon SQS メッセージが Lambda 関数を複数回呼び出さないようにするにはどうすればよいですか?」を参照してください。
冪等のベストプラクティスと関数ロジックの例については、「Lambda 関数を冪等にするにはどうすればよいですか?」を参照してください。
ソースキューの可視性タイムアウトを関数のタイムアウトの少なくとも 6 倍に設定します。追加の時間により、前のバッチの処理中に関数がスロットルされた場合、関数はバッチの処理を再試行することができます。
詳細については、Amazon SQS デベロッパーガイドの「可視性タイムアウトの設定」を参照してください。
注: キューの可視性タイムアウトが十分に長くないために関数がメッセージを受信しない場合、メッセージは Amazon CloudWatch Logs に記録されません。
ソースキューのリドライブポリシーで maxReceiveCount を少なくとも 5 に設定します。関数がエラーを返す場合、または最大同時実行性のため関数を呼び出すことができない場合、処理はさらに試行されて成功する可能性があります。maxReceiveCount を少なくとも 5 に設定すると、メッセージがデッドレターキューに送信される前に処理される可能性が高くなります。
詳細については、Amazon SQS デベロッパーガイドの「デッドレターキューの仕組み」と「一貫性のないメッセージ処理を避ける」を参照してください。
「Lambda 関数が失敗する場合のトラブルシューティング方法」の手順に従います。 関数がエラーを返さない場合にのみ、関数はキューからメッセージを自動的に削除します。