AWS Step Functions で JSONataが追加された
先日、僕が良く利用しているワークフローエンジン、AWS Step Functions に新しい記法が追加されました。
[アップデート] AWS Step Functions で変数が使えるようになりました - https://dev.classmethod.jp/
JSONata(ジェイソナータ)とは?
https://docs.jsonata.org/overview.html
JSONataは、JSONデータを扱うための軽量で強力なクエリ言語およびデータ変換言語です。主な特徴として:
- JSONデータの検索、フィルタリング、変換が簡単にできます
- XPathやSQLに似た直感的な構文を持っています
- 算術演算、文字列操作、配列処理などの豊富な組み込み関数を提供します
だそうです。
もともとあったJSONPathとそもそも違う思想のようです。
で、JSONataの組み込み関数そのものより、execution内部で独立したデータ格納領域についての言及のほうがけっこう推されている印象を受けたので、そこを中心に素振りしてみます。
変数ストレージとしてつかってみる
{
"StartAt": "ダミーデータ生成",
"States": {
"ダミーデータ生成": {
"Type": "Pass",
"Next": "加工",
"Assign": {
"myDummyNumber": 1000
}
},
"加工": {
"Type": "Pass",
"End": true,
"QueryLanguage": "JSONata",
"Output": {
"result": "{% $myDummyNumber %}"
}
}
}
}
実行してみます。
最終的な出力は {result:1000}
となりました。 Resultをつかわずとも、10MBのストレージ領域に値を保存し、後続のStateでのOutputでそれを利用できるようです。
いままでStepFunctions内で結果ストレージ的なものを作りたいときには、{$.result.task1output}
みたいなところにResultPathで結果を突っ込んで引き継いでいました。少しそこにハック感があったのですが、明確な保存領域ができたことで使い方がちょっと変わる気がします。
さらにはまだ全然使いこなせていませんが、ドキュメントを見ると膨大な組み込み関数があるよう..。
LambdaやBatchなどのタスク側でなく、ワークフローエンジン側にロジックを閉じ込めたほうが責務がシンプルになるケースってけっこうあるかと思っていますので、もうちょっと実験の上プロダクト利用を考えてみようかな。