Step FunctionsのJSONPathコードをJSONataに変換してみた
バニッシュ・スタンダードでインフラを担当しているTmaです。今回は、Step Functionsのステートマシン定義において、JSONPathで記述されたコードをJSONata形式に変換した事例についてご紹介します。きっかけは、JSONataで利用可能な日付関数を使いたかったことです。
JSONPathからJSONataへの変換
Step Functionsでは、ワークフローの定義にJSONPathまたはJSONataを使用できます。従来のJSONPathからJSONataに切り替えることで、より強力なデータ変換が可能になります。なお、現在新規にStep Functionsを作成する場合はJSONataがデフォルト設定になっています。
JSONataのメリット
JSONataは、JSONPathで使用されるフィールドと比較して、よりシンプルな方法で記述できます。組み込みの関数も豊富で表現力も増しています。JSONPathはどちらかというとデータを取得するツールに対して、JSONataはプログラマブルな記述が可能です。
日付関数の利用
今回JSONataへの変換の目的であった日付関数は、JSONataでは簡単に利用できます。例えば、現在の日時を取得してフォーマットするには、以下のような式を使用できます。
{% $now('[Y]-[M]-[D]') %}
今回はJSTの現在時刻が取得したかったので、下記のようにしています。
{% $fromMillis($toMillis($now()), '[Y0001]-[M01]-[D01] [H01]:[m01]:[s01]', '+0900') %}
条件式
論理式が充実しているので Choices
の条件式の記述もより完結になります。
例えば、以下のようなJSONPathのコードがあったとします:
"Choices":[
{
"Or": [
{
"Not": {
"Variable": "$.Flag",
"IsPresent": true
}
},
{
"Variable": "$.Flag",
"BooleanEquals": false
}
],
これをJSONataに変換すると、以下のようになります:
"Choices":[
{
"Condition": "{% $exists($states.input.Flag) and $boolean($states.input.Flag) %}",
I/O処理
JSONata
形式にすると、従来のI/O処理(Parameters
, ResultSelector
)が無効になり、Arguments
とOutput
を使用するようになります。JSONPathに比べて表現力が増し、可読性が増しました。
例えばStep Functionsに渡されるパラメータのデフォルト値を設定したい場合などはJSONPathに比べて非常に完結に記載できます。
"Flag": "{% $exists($states.input.Flag) ? $states.input.Flag : false %}",
変換のポイント
JSONPathからJSONataへの変換は、下記の点に注意して実施すればそこまでハマらないものでした。
-
QueryLanguage
をJSONata
と指定 -
Parameters
をArguments
に変換 -
ResultSelector
の廃止とOutput
への変更 -
.$
の削除: JSONPathで使用していた.$
は不要になります。代わりに、JSONataの式を{% %}
で囲みます。
例えば、以下のようなJSONPathのコードがあったとします:
{
"QueryLanguage": "JSONPath",
"Type": "Task",
"Parameters": {
"static": "Hello",
"title.$": "$.title",
"name.$": "$.customerName"
}
}
これをJSONataに変換すると、以下のようになります:
{
"QueryLanguage": "JSONata",
"Type": "Task",
"Arguments": {
"static": "Hello",
"title": "{% $states.input.title %}",
"name": "{% $customerName %}"
}
}
まとめ
今回は、Step FunctionsのJSONPathコードをJSONataに変換した事例をご紹介しました。JSONataへの変換は、コードの可読性向上と機能拡張に大きく貢献します。皆さんもぜひJSONataを試してみてください。
このブログ記事が、Step FunctionsでJSONataを活用する際の参考になれば幸いです。
参考リンク
AWS Step Functions が Variables と JSONata の変換で開発者のエクスペリエンスを簡素化
JSONataドキュメント
Discussion