🐵

Step FunctionsのJSONPathコードをJSONataに変換してみた

2025/02/21に公開

バニッシュ・スタンダードでインフラを担当している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)が無効になり、ArgumentsOutputを使用するようになります。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