次のようにフォーマットされたAWS Step Function Stateがあります。
"MyState": {
"Type": "Task",
"Resource": "<MyLambdaARN>",
"ResultPath": "$.value1"
"Next": "NextState"
}
2つ目の値を追加したいのですが、どこにあるのかわかりません。 AWSの例では、出力に追加される複数のResultPath値は表示されません。
それらの間にカンマを追加するだけですか?
"MyState": {
"Type": "Task",
"Resource": "<MyLambdaARN>",
"ResultPath": "$.value1, $.value2"
"Next": "NextState"
}
または、これらをフォーマットするより良い方法はありますか?
正直に答えましょう。意味がないので、複数のResultPath
値を指定することはできません。 Amazonはこれがどのように機能するかを説明するのにかなり悪い仕事をしていますので、これがなぜ混乱するのか理解しています。
ただし、ステートマシンの状態から複数の結果値を返すことができます。
一般的な詳細
任意の状態への入力はJSONオブジェクトです。 Stateの出力はJSONオブジェクトです。
ResultPath
は、ステートマシンに、ステートの出力(結果)をどうするかを指示します。 ResultPath
を指定しないと、デフォルトで$
になり、状態へのすべての入力が失われ、状態の出力に置き換えられます。
入力JSONからのデータが状態を通過できるようにする場合は、ResultPath
を指定して、次の状態に渡す入力JSONに追加/上書きするプロパティを記述します。
あなたのシナリオ
あなたのケースでは、$.value1
は、州の出力JSONが、ラムダの出力JSONを含む新規/上書きされたプロパティvalue1
を持つ入力JSONであることを意味します。
出力に複数の値が必要な場合、ラムダは、value1
プロパティの値となる複数の値を含むJSONオブジェクトを返す必要があります。
入力値がStateを通過できるようにする必要がない場合は、ResultPath
を省略して、デフォルトの$
のままにします。複数の値を含む出力JSONは、次の状態への入力になります。
サポートシナリオ
以下は、入力と出力を操作するために使用する簡単なステートマシンです。
{
"StartAt": "State1",
"States": {
"State1": {
"Type": "Pass",
"Result": { "Value1": "Yoyo", "Value2": 1 },
"ResultPath": "$.Result",
"Next": "State2"
},
"State2": {
"Type": "Pass",
"Result": { "Value2": 5 },
"ResultPath": "$.Result",
"Next": "State3"
},
"State3": {
"Type": "Pass",
"Result": "Done",
"End": true
}
}
}
次の入力でこれを実行します。
{
"Input 1": 10000,
"Input 2": "YOLO",
"Input 3": true
}
各ステージの入力と出力を調べます。次の点に注意してください。
ResultPath
は常に入力のResult
プロパティに出力を送信するため、入力はずっと通過します。State1
の出力は、State2
の出力によって上書きされます。最終的な影響はResult.Value1
が消え、Result.Value2
が「更新」されます。うまくいけば、これによりResultPath
を効果的に使用する方法が明確になります。
ResultPathはjsonで結果値のパスを定義するため、ResultPathに複数の値を指定することはできません。ステップは結果のjsonの1つのノードに配置する必要がある値を1つだけ返すことができるため、ResultPathの類似点は関数のreturn
値です。
入力JSONがある場合
{
"myValue": "value1",
"myArray": [1,2,3]
}
そして、ResultPathを$.myResult
として定義します。結果として生成されるJSON全体は次のようになります。
{
"myValue": "value1",
"myArray": [1,2,3],
"myResult": "result"
}
これで、このjsonを切り捨てて、OutputPathを使用して関数の次のステップにそのjsonの一部のみを渡すことができます(例:OutputPath: "$ .myResult")
InputPathとOutputPathの定義には複数のノードを含めることができますが、ResultPathには常に1ノードのみを含める必要があります。
次のようになると思いますが、実際に行ったことはないので、はっきりとは言えません。
"ResultPath": {
"var1" : "$.value1",
"var2" : "$.value2"
},
=====
これについて詳しく調べたところ、やりたいことを直接行う方法はないと確信しました。ここにあなたが望む結果を与えることができる方法があります。
1)ステップからInputPath、OutputPath、およびResultPathを省略します。これは、すべての$を意味します。 step関数への入力として渡され、ラムダ関数からのすべての出力は$として格納されます。ラムダ関数では、結果フィールドを任意の値に設定できます。ラムダ関数は、変更された入力を出力として返す必要があります。