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