🫠
Step FunctionのJSON Pathで配列の最後のアイテムを取得する
TL;DR
次のJSON Pathで取得できる。
$.array[(@.length-1)]
概要
Step Functionでは入出力をJSONで受け渡すことができ、JSON Pathの構文を用いてデータのフィルタリングや加工を行うことができます。
厳密にはステートは状態を持っており、各ステートごとにフィルタリングや加工を行うことができます。この辺については公式の説明がわかりやすいため、ここでは割愛します。
配列の最後のアイテムを取得するには?
配列の最後のアイテムを取得する際には、次のようにNegative Offsetを指定すれば良いと考えていました。
$.array[-1]
JSON Pathのドキュメントにも記載されていますし、この挙動はワークフローシミュレーターでも確認することができます。
しかし、実際に上記の構文でワークフローを実行すると、次のエラーが発生します。
ワークフローの例
{
"Comment": "Sample",
"StartAt": "Sample",
"States": {
"Sample": {
"Type": "Pass",
"Parameters": {
"hoge.$": "$.array[-1].name"
},
"End": true
}
}
}
実行時の入力
{
"array": [
{
"name": "hoge"
}
]
}
エラー文
"The JSONPath '$.array[-1].name' specified for the field 'hoge.$' could not be found in the input '{ "array": [ { "name": "Hoge" } ] }'"
詳細は分かりませんが、シミュレーターでは動作するのに、実際の実行で失敗するのはなんだか気持ち悪いですね。ちなみにIndexに0を指定した場合は正常に動作します。
途方に暮れていたところStack Overで見かけた方法を試し、無事に配列の最後の値を取得することができました。
{
"Comment": "Sample",
"StartAt": "Sample",
"States": {
"Sample": {
"Type": "Pass",
"Parameters": {
"hoge.$": "$.array[(@.length-1)]"
},
"End": true
}
}
}
Discussion