はじめに
最近のアップデートでステートマシンに変数設定ができるようになりました
これまでのステートマシンの実装ではより上流のステップで出力された値を下流のステップで使用するにはその中間のステップで入力と出力に含めて中継するようなことが必要でしたが
今回の変数を使用することでプログラミングのグローバル変数を使用するように、上流のステップで変数に設定した値は下流のステップで任意のタイミングで入力や出力で使用できるようになります
今回の記事ではその使い方をまとめてみました
↓こんな感じで変数をステップの外部で保持できるイメージ(AWSドキュメントより)
設定できる変数の種類
変数は以下のように1つの変数に1つの値を設定するものや、配列、Json形式のような構造体をはじめとしてJson形式で表現できる形で定義できます
{ "foo": 123, "bar": ["a", "b", "c"], "car": { "cdr": true } }
【StepFunctionsのビジュアルワークフローで設定した画面】
↓変数を設定したいステップを選択して「変数」タブを選択して変数を設定する
変数の呼び出し方
呼び出すときはJsonPathであれば下記のような構文で呼び出します
"【キー】": "{% $【呼び出したい変数名】%}"
固定値設定の変数呼び出し例(設定例では「123」が参照される)
{ "data": "{% $foo %}" }
配列設定の変数呼び出し例(配列の2番目の値(設定例では「b」)が参照される)
{ "data": "{% $bar[1] %}" }
構造体定の変数呼び出し例(設定例では「true」が参照される)
{ "data": "{% car.cdr %}" }
実際に動かしてみた①上流ステップの変数を下流ステップの出力で呼び出す
設定①上流ステップで変数の設定
設定②最終ステップで変数の内容出力
※この例ではLambdaの出力と一緒に、最終ステップの出力で配列変数の2番目の値を呼び出す
設定③ステートマシンの実行結果を確認
Lambdaの処理結果「result」と一緒に、設定したキー「data」の値として変数の値「b」が出力された
変数を途中で変更するには
ステートマシンのあるステップの出力結果を使って値を更新したい場合
例:2番目のステップの結果の値を変数に設定する
①2番目のステップのLambda(12345を結果として返す)
②ステートマシンの編集画面にて、2番目のステップの変数設定で結果を設定する
{ "foo": "{% $states.result.Payload.body.valueToPass %}" }
③最後のステップの出力結果を設定した変数にする
④結果:2番目のステップで設定した値が出力されることを確認
余談:2番目のステップの結果なのに2番目のステップで変数設定する理由は?
AWSドキュメントに記載がありましたが、変数の設定が該当のステップの処理の最後になるため、
2番目のステップの結果を変数に設定したいときは2番目のステップの中で設定します
思いつくユースケース
思い付きレベルですが、応用できるユースケースを記載しておきます。
他に良い使い方があれば教えて下さい
【思い付きユースケース例】
・エラーなどのメッセージをDBではなく変数として上流で設定しておき、ステートマシンの中で必要な時に適宜呼び出す
・データの種類ごとに変数を用意しておき、ステートマシン中の計算結果を変数に積み上げる
など
さいごに
昔ステートマシンの実装の際に上流の結果を下流に流すときにかなり苦労した気がします
上流で設定した変数を下流のどこでも呼び出せる今回のアップデートは、ステートマシン実装の簡略化やプログラムの可読性を向上させるのに嬉しいアップデートだと思います
参考URL
AWSドキュメント
https://docs.aws.amazon.com/step-functions/latest/dg/workflow-variables.html
クラメソさんの記事
https://dev.classmethod.jp/articles/step-functions-variables/