Q66 — AWS SAA-C03 第17章

第 66/89 問 | ← 第17章

Q1366. ソリューションアーキテクトは、アプリケーションコンテナ、AWS Lambda関数、およびAmazon SQSキューから構成されるアプリケーションを管理しています。Lambda関数はSQSキューをイベントソースとして使用しており、呼び出されると第三者の機械学習(ML)APIを呼び出します。この第三者APIからの応答は最大60秒かかることがあります。現在、Lambda関数のタイムアウト値は65秒に設定されています。ソリューションアーキテクトは、Lambda関数がSQSキューから重複したメッセージを処理することがあることに気づきました。Lambda関数が重複メッセージを処理しないようにするには、どのような対応を取るべきでしょうか?

正解: D. SQSキューのビジビリティタイムアウト値を、第三者API呼び出しに要する最大時間より長く設定します。

解説

正解はDです。「SQSキューのビジビリティタイムアウト値を、第三者API呼び出しに要する最大時間より長く設定する」ことです。 解説: 重複メッセージが発生する原因は以下の通りです。 ・Lambda関数がSQSメッセージによって起動されます。 ・Lambda関数がメッセージ処理に時間がかかりすぎ(例:遅い第三者APIの応答待ち)、SQSのビジビリティタイムアウトが経過する前にメッセージをキューから削除できていない場合、そのメッセージは再び可視状態になり、別のLambda実行によって再処理される可能性があります(重複処理の原因)。 なぜ選択肢Dが最適か? ・SQSのビジビリティタイムアウトは、Lambda関数がメッセージを取得した後、他のコンシューマーからそのメッセージを隠す期間を定義します。 ・Lambda関数がビジビリティタイムアウト内にメッセージを削除しなかった場合、SQSは処理が失敗したと判断し、メッセージを再び可視状態にします(重複の原因)。 ・解決策:Lambdaの処理時間(第三者APIの60秒+Lambda自身の実行時間)より長い値にビジビリティタイムアウトを設定します。  例:API応答が60秒、Lambda実行が5秒かかる場合、ビジビリティタイムアウトを65秒以上(例:70秒)に設定します。 ・これにより、Lambda関数が処理を完了してメッセージを削除するまでの間、メッセージが再び可視になるのを防ぎ、重複処理を防止できます。 他の選択肢が不適切な理由: A:Lambda関数のメモリ量を増やすこと——重複問題の解決にはなりません。メモリはパフォーマンスに影響しますが、メッセージの可視性や再配信ロジックとは無関係です。 B:Lambda関数のタイムアウト値を増やすこと——部分的な対応ではありますが、十分ではありません。Lambdaのタイムアウトを延長しても、SQSのビジビリティタイムアウトが短いままだと、Lambdaが完了する前にメッセージが再び可視になり得ます。両者のタイムアウト値は整合させる必要がありますが、根本的に重複を防ぐにはSQSのビジビリティタイムアウトの設定が鍵となります。 C:SQSキューのデリバリーディレイ値を第三者API呼び出しの最大時間より長くすること——デリバリーディレイは、メッセージがキューに送信されてから他のコンシューマーが読み取れるようになるまでの待機時間を制御するものであり、メッセージがコンシューマー(ここではLambda)によって取得された後の可視性には一切影響しません。この選択肢は機能の誤解に基づいています。 重複を回避するベストプラクティス: ・SQSのビジビリティタイムアウトを、Lambda実行時間+API呼び出し時間(本問では70秒程度)より長く設定します。 ・Lambda関数が正常に処理を終了した後、DeleteMessage APIを使ってメッセージを確実にキューから削除します。 ・繰り返し失敗するメッセージについては、SQSのデッドレターキュー(DLQ)を活用し、無限リトライを防ぎます。 結論:選択肢Dが正しい解決策です。SQSのビジビリティタイムアウトを適切に設定することで、Lambdaがメッセージを処理・削除するまでメッセージが再び可視になるのを確実に防げます。 選択肢A、B、Cはいずれも重複処理の根本原因に対処していません。 最終的な正解:D