目次
はじめに
AWS Step Functionsの直列処理を定期運用で使用している際、途中で落ちても最後まで処理を実行したいという要件がありました。
ただし、処理が一つでも落ちたら最終的にはエラー終了にて終わらせるように設計する必要があります。
上記内容を実現するための方法をまとめましたので参考にしてください。
システム構成
- 変数の定義
- Step1の実行
- Catch処理でエラー検知
- Step2の実行
- Catch処理でエラー検知
- Choicesでまとめてエラー処理
特に重要となるのが1の変数の定義となります。
こちらの変数の定義については、Stepfunctionsにて2024年11月22日に追加された比較的新しい機能になります。
参考:
従来は変数を使用したい場合は、一つ一つのStepにて引き継いで処理を作成する必要があり非常に煩雑な内容になってしまっていました。
そこを今回変数を使用することで簡易的な実装を行うことが出来ます。
詳細
上記が実際のコード例になります。
また実際に作成すると以下のような形になります。
それぞれの処理の詳細について簡単に説明させていただきます。
ステート名 | タイプ | 説明 |
InitErrorFlag |
Pass | 実行開始時に errorFlg を0で初期化する |
Step1 |
Task | 最初のLambda(arn:aws:lambda:xxx )を実行。エラー時は LogErrorStep1 。成功時は Step2 |
LogErrorStep1 |
Pass | Step1 が失敗した場合に変数 errorFlg: 1 を設定 |
Step2 |
Task | 2つ目のLambda(arn:aws:lambda:yyy )を実行。エラー時は LogErrorStep2 。成功時は CheckFailures |
LogErrorStep2 |
Pass | Step2 が失敗した場合に変数 errorFlg: 1 を設定 |
CheckFailures |
Choice | errorFlg を確認:1なら FailState 、0なら SuccessState |
FailState |
Fail | エラー発生として実行を終了(失敗扱い) |
SuccessState |
Succeed | 正常完了として実行を終了(成功扱い) |
今回特に重要となるのがInitErrorFlagステートでの変数の初期化とCheckFailuresステートでのエラー判定になります。
InitErrorFlag
Assignにて変数の初期化を行ってます。
今回はエラー判定のために0を初期値として設定しています。
Step1
Catchを使用してエラー時の処理を決めています。
今回は全てのエラーを対象にしていますが、特定のエラーを対象にすることもできます。
LogErrorStep1
こちらでエラーが起きた場合に変数に1を格納します。
この値を後ほど参照してエラーが起きたかを確認します。
CheckFailures
Choicesを使用して変数の値によって遷移先を指定しています。
今回はエラー時に変数に1を格納しているため、1の時にはFailStateに遷移するよう設定しました。
おわりに
今回はエラー時にも処理を止めず最後に判定するようなシステムを構成しました。
Stepfunctionsのエラーハンドリングにはこの他にもRetry機能等が存在しております。
それぞれの要件にあったシステム構成を簡単に作成できると思いますので、今後も積極的に利用していきましょう!