ある物流企業が、SQSキューを使って荷物追跡イベントを処理している。消費者LambdaがたびたびSQSメッセージの処理に失敗し、同じメッセージが繰り返し再試行されて他のメッセージの処理が遅延している。障害メッセージを隔離しつつ正常メッセージの処理継続を最小限の設定変更で実現する方法はどれか。
- A. Lambdaの同時実行数を1にしてメッセージを逐次処理し、失敗時は手動でDLQに移動する
- B. SQSキューのmaxReceiveCountを設定し(例: 3)、DLQ(デッドレターキュー)を関連付ける。LambdaトリガーのReportBatchItemFailuresを有効にして個別メッセージの失敗を報告する
- C. SQSキューをFIFOキューに変換し、メッセージグループIDを設定して順序を保証する
- D. SQSキューの可視性タイムアウトを0秒に設定し、失敗したメッセージを即座に再処理する
解答と解説を見る
正解: B
DLQ(Dead Letter Queue)はmaxReceiveCountを超えて再試行された失敗メッセージを自動的に別キューに移動する仕組みである。加えてLambdaのSQSトリガーでReportBatchItemFailuresを有効にすると、バッチ内の一部メッセージのみが失敗した場合にその特定メッセージだけをキューに戻せる(バッチ全体の再処理を避けられる)。これにより障害メッセージの隔離と正常メッセージの継続処理が両立できる。Dの可視性タイムアウト0秒は失敗時に即座に再可視化されて他コンシューマーに届くが、根本的な処理失敗原因が解決されない限り無限ループになる。CのFIFO変換は順序保証のためのものであり、障害隔離が目的の場合には余計な制約(スループット300/秒制限)を追加するだけで問題は解決しない。Aの同時実行数1はスループットを著しく低下させ、手動DLQ移動は運用負荷が高く、自動化の恩恵を受けられない。
📚 関連サービスの解説: Amazon SQS ・ AWS Lambda