web-dev-qa-db-ja.com

AWS Step Functionsで複数の結果パス値を指定する方法

次のようにフォーマットされた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"
}

または、これらをフォーマットするより良い方法はありますか?

13
Jake T.

正直に答えましょう。意味がないので、複数の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を効果的に使用する方法が明確になります。

26
Zodman

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ノードのみを含める必要があります。

1
Serg

次のようになると思いますが、実際に行ったことはないので、はっきりとは言えません。

"ResultPath": {

                 "var1" : "$.value1",
                 "var2" : "$.value2"
 },

=====

これについて詳しく調べたところ、やりたいことを直接行う方法はないと確信しました。ここにあなたが望む結果を与えることができる方法があります。

1)ステップからInputPath、OutputPath、およびResultPathを省略します。これは、すべての$を意味します。 step関数への入力として渡され、ラムダ関数からのすべての出力は$として格納されます。ラムダ関数では、結果フィールドを任意の値に設定できます。ラムダ関数は、変更された入力を出力として返す必要があります。

0
Itsme2003