AWS Step Functionsでは実は使えないJSONata関数がある
こんにちは。サービス開発室の武田です。
AWS Step FunctionsのJSONata使ってますか?(挨拶)
全体をいきなり置き換えるのはたいへんですので、ステート1個ずつから始めていくと導入しやすいです。
さて、実はStep Functionsは独自にJSONataの関数を追加しており、逆に使えない関数があることをご存じでしょうか?今回はそれらの関数を紹介します。
Step Functionsに追加された独自JSONata関数
Step Functionsでは次の6個のJSONata関数が追加されています。
1. $partition - 配列の分割
States.ArrayPartitionの代替となる関数です。大きな配列を指定したサイズのチャンクに分割します。
{
"Assign": {
"arrayPartition": "{% $partition([1, 2, 3, 4, 5, 6, 7, 8, 9], 3) %}"
}
}
上記の例では、[[1, 2, 3], [4, 5, 6], [7, 8, 9]]という2次元配列が生成されます。最後のチャンクは指定サイズより小さくなることがあります。
2. $range - 連続値配列の生成
States.ArrayRangeの代替となる関数です。開始値、終了値、ステップ値を指定して配列を生成します。
{
"Assign": {
"evenNumbers": "{% $range(0, 10, 2) %}"
}
}
この例では[0, 2, 4, 6, 8, 10]が生成されます。ステップ値を負数にすることで、逆順の配列も作成できます。
3. $hash - ハッシュ値の計算
States.Hashの代替となる関数です。文字列のハッシュ値を計算します。
{
"Assign": {
"contentHash": "{% $hash($states.input.content, 'SHA-256') %}"
}
}
サポートされているアルゴリズムは次のとおりです。
- MD5
- SHA-1
- SHA-256
- SHA-384
- SHA-512
4. $random - 乱数生成(シード対応)
States.MathRandomの代替となる関数です。標準JSONataの$random関数とは異なり、シード値を受け付けます。
{
"Assign": {
"randNoSeed": "{% $random() %}",
"randSeeded": "{% $random($states.input.seed) %}"
}
}
シード値を使用することで、同じシードからは常に同じ乱数が生成され、テスト時の再現性を確保できます。
5. $uuid - UUID生成
States.UUIDの代替となる関数です。バージョン4のUUIDを生成します。
{
"Assign": {
"requestId": "{% $uuid() %}"
}
}
6. $parse - JSON文字列のパース
文字列化されたJSONをオブジェクトに変換します。標準JSONataでは$evalが同様の機能を提供しますが、Step Functionsでは$evalがサポートされていないため、代替として用意されています。
{
"Assign": {
"parsedData": "{% $parse($states.input.json_string) %}"
}
}
Step Functionsで使えないJSONata関数
$eval - 式の動的評価
セキュリティ上の懸念から、動的なコード実行は 無効化 されています。先ほど少し書きましたが、代替として、JSON文字列のパースには$parse関数を使用しましょう。
まとめ
特に覚えておきたいのは$eval関数が無効化されていることです。JSON文字列をパースしたい場合は$parse関数を使うことになりますので、ぜひ覚えておきましょう!






