AWS Step FunctionsのChoiceステートではEndフィールドを使用できない
AWS Step Functionsで条件分岐(Choiceステート)があるステートマシンを作成しようとしたときに、Choiceステート内でEnd
フィールドを使用できなかったので他の方法を探してみました。
Choiceステート内でEndフィールドを指定したらエラーとなった
Step Functionsで以下のようなフローのステートマシンを作ろうとしました。
- ステートマシンを開始する(開始)
- Lambdaを実行して戻り値を取得する(処理1)
- 処理1の戻り値をもとに条件分岐する(条件分岐)
True
なら終了に進むFalse
なら処理2に進む
- Lambdaを実行して戻り値を取得する(処理2)
- ステートマシンを終了する(終了)
<img src="https://devio2024-2-media.developers.io/upload/wp-author-wakatsuki-ryuta/2025-01-25/a55183c8-0f7c-41ac-96c6-04cb10c7f02f.png" width="450">
そこで以下のようなJSON定義を作成しました。条件分岐
ではChoiceステートを利用して条件に一致する場合はステートマシンを終了(End
フィールドにtrue
を指定)し、そうでない場合は処理2
に進む(Default
フィールドに処理2
を指定)処理としています。
{
"StartAt": "処理1",
"States": {
"処理1": {
"Type": "Task",
"Resource": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:test",
"Next": "条件分岐"
},
"条件分岐": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.key1",
"BooleanEquals": true,
"End": true
}
],
"Default": "処理2"
},
"処理2": {
"Type": "Task",
"Resource": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:test2",
"End": true
}
}
}
しかし、このJSON定義をAWSコンソールのステートマシンの作成ページのエディターに貼り付けてみると、Choice
処理の部分が以下のようにエラーとなりました。
上側のバツ印にマウスオーバーするとThese fields are required: Next
とメッセージが出ています。
下側のバツ印にマウスオーバーするとField End is not supported
とメッセージが出ています。
この状態だと当然ステートマシンは保存できず正常に動作させることもできません。
ダミーのPassステートを使ったら上手くいった
AWSのStep Functionsのドキュメントの「Choiceステート」ページを読んでみると以下のようにありました。
Choice states don't support the End field. In addition, they use Next only inside their Choices field.
ChoiceステートのChoices
フィールドの内部では、End
フィールドはサポートしておらず、Next
しか使えないとはっきり書いてありますね。先ほどのJSON定義はこの仕様に反していたためエラーとなっていたようです。
しかし、条件分岐でTrue
となる場合はステートマシンを終了させる以外の処理は不要のため、Next
フィールドを使うにしてもその後続処理では何もさせたくありません。
そこで便利なのがPassステートです。ドキュメントの「Passステート」ページを読んでみると
A Pass state ("Type": "Pass") passes its input to its output, without performing work. Pass states are useful when constructing and debugging state machines.
とあり、Passステートはinputをそのままoutputするだけの「何もしない」をするステートとのことです。なので基本的な用途はステートマシン作成時のデバッグ用となります。
今回はこのPassステートの「何もしない」仕様を利用します。ChoiceステートのEnd
フィールドにPassステートダミー
を指定し、ダミー
でEnd
フィールドにtrue
する以下のようなJSON定義とすれば、要望通りのステートマシンを作ることができました。
{
"StartAt": "処理1",
"States": {
"処理1": {
"Type": "Task",
"Resource": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:test",
"Next": "条件分岐"
},
"条件分岐": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.key1",
"BooleanEquals": true,
"Next": "ダミー"
}
],
"Default": "処理2"
},
"処理2": {
"Type": "Task",
"Resource": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:test2",
"End": true
},
"ダミー": {
"Type": "Pass",
"End": true
}
}
}
最終的に作成したステートマシンのフロー図。
おわりに
Choiceステートで、何もさせずにすぐにステートマシンを終了させる条件分岐を作りたい時はPassステートを使えばいいよ!というTipsでした。
余談ですがフロー図の作成は https://app.diagrams.net/ というサイトを利用しましたがとても便利でした。
参考
- Choice | How Step Functions Works
- Pass | How Step Functions Works
- Common State Fields | Amazon States Language
以上