DVA-C02開発MEDIUM単一選択

あるEコマース企業が、注文確定時にSQSキューからLambdaを呼び出して在庫を更新するシステムを運用している。ネットワーク障害や外部APIのタイムアウトにより、まれにLambdaが例外をスローして処理が失敗する。失敗した注文メッセージを失わずに後から再処理できるようにしたい。コードの変更を最小限に抑えつつ、処理失敗メッセージを保全する構成として最も適切なものはどれか。

  1. A. SQSキューのメッセージ保持期間を最大(14日)に延長し、失敗メッセージが自然に再配信されるまで待つ
  2. B. LambdaにデッドレターキューとしてSQSキュー(DLQ)を設定し、最大受信数を超えたメッセージをDLQに送る
  3. C. Lambdaのタイムアウトを15分に延ばしてリトライ回数を増やす
  4. D. 失敗時にLambda内のcatch句でメッセージをDynamoDBテーブルに手動で保存するロジックを追加する
解答と解説を見る

正解: B

SQSトリガーのLambdaでは、処理が失敗してメッセージの削除が行われないとメッセージは可視性タイムアウト後にキューに戻り、再度Lambdaに配信される。これを最大受信数(maxReceiveCount)を超えた回数リトライしても失敗した場合、デッドレターキュー(DLQ)に自動的に移動させることができる。DLQに蓄積されたメッセージは後から調査・再処理が可能であり、コードを変更せずにSQSとLambdaの設定だけで実現できる。選択肢Aのメッセージ保持期間延長は失敗メッセージを「失わない」という目的には部分的に合致するが、正常処理されたメッセージも14日間残り続けるため、キューが肥大化して正常な処理を妨げるリスクがある。選択肢CのタイムアウトはエラーがネットワークやAPIタイムアウトに起因する場合には意味があるが、DLQのような保全メカニズムにはならない。選択肢DはDynamoDBへの手動保存という「コードの変更を最小限に」という要件に反するアプローチである。

▸ この試験を本気で演習する(全150問・無料)