みなさんはAWSでサーバレス基盤を活用した開発を行う際にAWS Step Functionsを使っていますでしょうか。シンプルなステートが不要でリクエストに対してレスポンスを返すだけの場合AWS Lambda単独の開発で十分ですが、数珠つなぎの処理や途中で条件分岐などを行う処理の場合、Lambda関数が複数となり、関数Aが関数B、時には関数Cを呼び出すという構成になってしまいます。
AWS Lambdaはステートレス基盤ですので、この場合正常に動作しているケースではいいですが、途中で処理が異常終了した場合、どこにエラーがあったか、どこからリトライを行えばいいのか、といった調査が難しくなっていきます。
AWS Step Functionsを活用することでそれらが可視化されます。
AWS Step Functions とは

Step Functionsはステートマシンといわれ、上図の様に複数の処理をつなぐ役割をになっています。AWS SDKを包含しており、200を超えるAWSのAPIコールはコーディングなしで行えるため、Lambdaのコード量も減らすことができます。
JSONPathとJSONata
Step Functionsは各ブロック(処理)の間のデータの受け渡しにJSONを用います。そしてJSONPathに対応しているため、JSON内の構造化されたデータから特定の値を取り出す、といった操作はノーコードで実装が可能でした。
2024年11月にさらにJSONataがサポートされました。読み方ですが調べたところジェイソナタだそうです。
JSONataはJSONPathよりさらに強力なデータ操作の機能が提供されます。JSONataを用いることで、JSONPathでは行えなかった文字列操作や集計、四速計算等の数字操作、日付・時間操作等多くのことが行えるようなりました。従来これを行うためにはあるブロックが出力したJSONを次のブロックのLambdaに繋ぎ必要な処理を行う必要がありましたが、単一ブロックの中でJSONデータの操作が行えるようなった、ということです。
さっそくやってみる
マネージメントコンソールからステートマシンの作成をクリックします。

適当な名前を付けて続行をクリックします。

GUIでも開発は行えますが、再現性を重視してコードをクリックします。

以下のJSONをペーストします。
{
"Comment": "JSONataテスト用の最もシンプルなワークフロー",
"QueryLanguage": "JSONata",
"StartAt": "JSONataTest",
"States": {
"JSONataTest": {
"Type": "Pass",
"Comment": "JSONata式をテストする",
"Output": {
"originalInput": "{% $states.input %}",
"message": "{% 'Hello, ' & $states.input.name & '!' %}",
"timestamp": "{% $now() %}"
},
"End": true
}
}
}
作成をクリックすればステートマシンンが出来上がります。

ステートマシンクエリ言語がJSONataになっています。
実行をクリックして以下のJSONをInputとして入力して、実行を開始をクリックします。
{
"name": "kameda",
"age": 52
}

従来のJSONPath形式では[kameda]を取り出すことはできましたが、以下のoutputの様に文字列を連結したり、日時を挿入したりするには外部Lambda関数が必要でした。JSONPathの様に一つのブロックだけでこれが実装できていることがわかります。
{
"output": {
"originalInput": {
"name": "kameda",
"age": 52
},
"message": "Hello, kameda!",
"timestamp": "2025-05-24T12:55:28.929Z"
},
"outputDetails": {
"truncated": false
}
}