あるニュースアプリが、SQSを使ってメッセージを処理している。Lambdaコンシューマーがメッセージを取得後、処理中にクラッシュした場合でもメッセージが失われないようにしたい。最小限の設定変更で実現できる方法はどれか。
- A. LambdaのリトライポリシーをSQSトリガー設定で最大3回に増やす
- B. SQSキューをFIFOキューに変更して順序保証と重複排除を有効にする
- C. メッセージ受信後すぐにアプリケーション側でDeleteMessageを呼び出し、処理結果をDynamoDBに記録する
- D. SQSキューの可視性タイムアウトをLambdaの最大処理時間より長く設定し、処理成功後にメッセージを削除する
解答と解説を見る
正解: D
SQSの可視性タイムアウト内にDeleteMessageが呼ばれない場合、メッセージは自動的にキューに戻り他のコンシューマーが再取得できる。LambdaがSQSをイベントソースとして使う場合、Lambda処理が成功して初めてSQSメッセージが削除されるため、クラッシュ時はメッセージが再利用可能になる。ポイントは可視性タイムアウトをLambdaの最大実行時間より長く設定して二重配信ウィンドウを適切に管理することにある。AのLambdaリトライポリシーはSQSトリガー設定に独立したリトライ回数設定はなく(SQS側のmaxReceiveCount)、クラッシュ時のメッセージ保持とは別の話である。BのFIFO変換はメッセージ順序が必要な場合に有効だが、メッセージ喪失防止にはFIFO変換は不要であり、コスト増・スループット制限もある。Cは受信直後に削除するとクラッシュ時にメッセージが完全に失われる最悪のパターンである。
📚 関連サービスの解説: Amazon SQS ・ AWS Lambda