無限ノック › DVA 練習問題一覧 › 問題
DVAトラブルシューティングと最適化

ECサイトの注文処理ワークフローをAWS Step Functionsで構築しています。`ProcessPayment` ステートはLambda関数を呼び出しており、一時的な決済ゲートウェイの障害時に `PaymentFailedException` をスローすることがあります。開発チームは以下の3つの動作を実装したいと考えています。 ① `PaymentFailedException` 発生時は最大3回、指数バックオフでリトライする ② すべてのリトライが失敗した場合は `CompensateOrder` ステートに遷移する ③ その他の予期しないエラーは `NotifyError` ステートに遷移する これら3つの要件をすべて満たすステートマシンの設定はどれですか?

A
Retry に ErrorEquals: ["PaymentFailedException"]、MaxAttempts: 3、BackoffRate: 2 を設定する。Catch は ErrorEquals: ["PaymentFailedException"] → CompensateOrder を先頭に、ErrorEquals: ["States.ALL"] → NotifyError を後に設定する。
✓ 正解
Retry に PaymentFailedException のみ指定することで要件①を満たし、Catch の順序も具体的なエラーを先頭に定義することで、リトライ上限後は CompensateOrder へ、その他エラーは NotifyError へ正しく振り分けられる。3つの要件をすべて満たす正しい設定。
B
Retry に ErrorEquals: ["States.ALL"]、MaxAttempts: 3、BackoffRate: 2 を設定する。Catch は ErrorEquals: ["PaymentFailedException"] → CompensateOrder を先頭に、ErrorEquals: ["States.ALL"] → NotifyError をその後に設定する。
Retry に States.ALL を指定すると、PaymentFailedException 以外の予期しないエラーも最大3回リトライされてしまう。要件①では PaymentFailedException のみをリトライ対象とすべきであり、States.ALL を使った Retry はスコープが広すぎて適切でない。
C
Retry フィールドは使用しない。Catch に ErrorEquals: ["PaymentFailedException"](RetryCount: 3 を指定)→ CompensateOrder を先頭に、ErrorEquals: ["States.ALL"] → NotifyError をその後に定義する。
Step Functions の Catch フィールドに RetryCount というパラメータは存在しない。リトライ機能は Retry フィールドでのみ定義でき、Catch だけではリトライを制御できないため、要件①である最大3回の指数バックオフリトライを実現できない。
D
Retry に ErrorEquals: ["PaymentFailedException"]、MaxAttempts: 3、BackoffRate: 2 を設定する。Catch は ErrorEquals: ["States.ALL"] → NotifyError を先頭に、ErrorEquals: ["PaymentFailedException"] → CompensateOrder をその後に設定する。
Catch の配列は先頭から順に評価されるため、States.ALL を先頭に置くと PaymentFailedException もこのエントリに捕捉される。リトライ上限後に CompensateOrder へ遷移させるには、PaymentFailedException の Catch エントリを States.ALL より前に定義する必要がある。

解説

Step Functions では Retry と Catch を組み合わせてエラーハンドリングを細かく制御できます。Retry は Catch より先に評価され、MaxAttempts を超えた場合にのみ Catch に処理が移ります。 Retry に ErrorEquals: ["PaymentFailedException"] を指定することで、支払いエラーのみを対象にリトライし要件①を満たします。Catch は配列の先頭から順番に評価されるため、より具体的な ["PaymentFailedException"] → CompensateOrder を先頭に定義し、その後に ["States.ALL"] → NotifyError を定義することで、リトライ上限後の補償処理と予期しないエラーの通知処理を正しく振り分けられます。 選択肢Bの Retry 設定は、ErrorEquals に ["States.ALL"] を使用するため、PaymentFailedException 以外のエラー(入力バリデーションエラーなど)も最大3回リトライされてしまい、要件①を満たしません。 選択肢Cの Catch 設定は、RetryCount というパラメータは Step Functions に存在せず、リトライ機能は Retry フィールドでのみ実現できます。Catch だけではリトライを制御できません。 選択肢Dの Catch 設定は、["States.ALL"] が先頭にあるため、PaymentFailedException がリトライ上限に達した場合も States.ALL に捕捉されて NotifyError に遷移し、CompensateOrder には到達できません。

ドメイン別正答率・予想スコアでリアルタイムに実力把握

無限ノックでDVAを徹底対策。全問AI生成のオリジナル問題。

無料で演習を始める →
← DVA の問題一覧に戻る