Lambda関数がSQS標準キューからメッセージをポーリングして処理しています。キューのVisibilityTimeout(可視性タイムアウト)は30秒に設定されていますが、Lambda関数のタイムアウトは60秒です。一部のメッセージで処理に60秒近くかかった後に正常完了しているにもかかわらず、同じメッセージが複数回処理されてしまいます。この問題の根本原因と最善の解決策はどれですか?
SQSのVisibilityTimeoutは、メッセージ受信後に他のコンシューマーからそのメッセージが見えなくなる時間です。Lambdaタイムアウト(60秒)がVisibilityTimeout(30秒)を超えると、処理完了前にメッセージが再び可視化され、別のLambdaインスタンスが同じメッセージを受信します。AWSベストプラクティスではVisibilityTimeoutをLambdaタイムアウトの6倍以上(この場合は360秒以上)に設定することを推奨しています。 選択肢Aの予約済み同時実行数は並列処理数を制御するものであり、VisibilityTimeout設定が原因の重複処理とは無関係です。 選択肢CのFIFOキューへの移行はexactly-once処理を提供しますが、根本原因を修正せずに問題を回避するだけで、スループット制限も生じます。 選択肢DのBatchSize=1は1回のInvocationあたりのメッセージ数を減らすだけで、VisibilityTimeout設定の問題は解決しません。