Q29 — AWS SAA-C03 第4章
第 29/105 問 | ← 第4章
Q224. ある画像処理会社が、ユーザーが画像をアップロードするためのWebアプリケーションを運用しています。このアプリケーションは、アップロードされた画像をAmazon S3バケットに保存します。同社では、S3イベント通知を設定し、オブジェクト作成イベントをAmazon Simple Queue Service(Amazon SQS)標準キューに送信するようにしています。このSQSキューは、画像を処理して結果をメールでユーザーに送信するAWS Lambda関数のイベントソースとして機能しています。ユーザーから、1つの画像アップロードに対して複数のメールが届いているという報告が寄せられています。ソリューションズアーキテクトは、SQSメッセージがLambda関数を複数回呼び出しているため、重複したメールが送信されていることを特定しました。この問題を、最も少ない運用オーバーヘッドで解決するには、ソリューションズアーキテクトは何を行うべきでしょうか?
- A. SQSキューでロングポーリングを有効化し、ReceiveMessageの待機時間を30秒に増加させる
- B. SQS標準キューをSQS FIFOキューに変更し、メッセージ重複排除ID(Message Deduplication ID)を用いて重複メッセージを破棄する
- C. SQSキューの可視性タイムアウトを、Lambda関数のタイムアウトとバッチウィンドウタイムアウトの合計よりも大きい値に増加させる ✓
- D. Lambda関数を変更し、メッセージを読み取った直後にSQSキューから即座に削除してから処理を開始する
正解: C. SQSキューの可視性タイムアウトを、Lambda関数のタイムアウトとバッチウィンドウタイムアウトの合計よりも大きい値に増加させる
解説
SQS標準キューでは、メッセージの重複配信(at-least-onceデリバリー)が保証されており、ネットワーク遅延やタイムアウトなどの理由で同一メッセージが複数回配信される可能性があります。これにより、Lambda関数が同一メッセージを複数回実行し、重複メールが送信されます。この問題を最小限の運用オーバーヘッドで解決するには、SQS標準キューの仕様(重複配信)に対応した設計が必要です。選択肢Cは、可視性タイムアウトを十分に長く設定することで、Lambda関数がメッセージ処理中にタイムアウトせず、完了前にメッセージがキューに戻って再配信されるのを防ぎます。これにより、メッセージの重複処理を抑制できます。一方、選択肢A(ロングポーリング)は、受信効率を向上させますが、重複配信そのものを防止しません。選択肢B(FIFOキュー)は重複排除を提供しますが、S3イベント通知はFIFOキューを直接サポートしておらず、追加のインフラ構成(例:SNS経由など)が必要になるため、運用オーバーヘッドが増加します。選択肢Dは、メッセージを即時削除すると、処理失敗時にメッセージが失われるリスクがあり、信頼性が損なわれます(Lambdaはメッセージの自動削除を管理すべきです)。したがって、最も適切かつ最小オーバーヘッドな解決策はCです。