ステートマシンをJSONata構文で書く時に難しかったことまとめ
AWSのStepFunctionsでステートマシンを記述する時、従来はJSONPath構文でASLを記述していましたが、新たにJSONata構文で記述できるようになりました。JSONata式が使えたり変数が使えるようになったり色々便利になりました。
AWS的にもJSONataが推奨とのことなので今のうちに慣れておくかと思って挑戦しましたが、従来のJSONPath構文と大きく記法が変わってめちゃくちゃ大変でした。今回は大変だったポイントをまとめて行こうと思います。
ステートマシンの書き方と値の扱い方について
まず最初に混乱したのがステートマシンの書き方が大きく変わった事と値の扱い方が変わった事。
従来は値をInputで受け取ってLambda関数とかで処理をして、その結果をeventの中に入れてreturnする、またはResultPathに結果を格納して次のステートに渡していく「バケツリレー方式」でした。これがアップデートにより、「変数」に格納してどこからでも参照できるようになりました。
変数として登録するにはAssign
を使います。次のステートでそのまま使う場合はOutput
に流します。
最初はバケツリレー方式が染み付いてしまっていたので、「次のステートに値を渡したい時はどうするんだ?」とずっと迷ってました。
結論としては以下のような感じに落ち着きました。
- 次のステートで使いたい→Outputで渡して次のステートでは
$states.input
で受け取る。 - もっと後段のステートで使いたい→Assignで渡して対象のステートでは
{% $SampleVariable %}
みたいな感じで受け取る。
次のステートでもAssignでも良いのでは?と思ったのですが、
ちなみに変数が使える事とJSONataサポートは別の話です。アナウンスが同時だったので「変数はJSONataじゃないと使えない」というわけではないです。ですがJSONataの関数と組み合わせて使うことでより効果を発揮するので同時に使う事をおすすめします。
JSONataについて
そもそもJSONataを知らない人はまずこの動画を見るのをおすすめします。英語ですが見るだけで大半は理解できると思います。
上記の動画で流れが掴めたら、使いたい処理を探す感じになります。公式サイトでお試しできます。
大抵の事は一通りできるので、こういった変換処理のためにLambda関数を使っている場合は置き換えができるかもしれません。特に文字列の置換だったりフィルタリングだったりはよくやる処理だと思います。
実際、私が過去に作ったステートマシンを書き直した所、半分以上のLambda関数を無くす事ができました。
まとめ
最初はめちゃくちゃ困惑しましたが、全体像が掴めると非常にシンプルに扱えるようになっています。
- OutputとAssinの使い方
- JSONataを使って値を変換、参照する
この順番でやってみるのが良いと思います。最悪JSONataは使わなくても代用できますが値の渡し方や参照の仕方は代用できないのでここから理解するのが近道です。
参考
変数と JSONata を使った AWS Step Functions での開発者エクスペリエンスの簡素化
ここでは従来Lambdaで実装していたデータ変換をJSONataに置き換えているサンプルが見られます。
Step Functions での JSONata を使用したデータの変換
ここではJSONPathで書いたステートマシンをJSONataに変換したらどうなるかを解説しています。値の受け取り方や渡し方についてはここで確認できます。
変数について
Discussion