22

我有一个格式如下的 AWS Step Function State:

"MyState": {
  "Type": "Task",
  "Resource": "<MyLambdaARN>",
  "ResultPath": "$.value1"
  "Next": "NextState"
}

我想添加第二个值,但在任何地方都找不到。AWS 示例均未显示添加到输出的多个 ResultPath 值。

我可以在它们之间添加一个逗号吗?

"MyState": {
  "Type": "Task",
  "Resource": "<MyLambdaARN>",
  "ResultPath": "$.value1, $.value2"
  "Next": "NextState"
}

或者有没有更好的方法来格式化这些?

4

4 回答 4

43

让我们直接回答这个问题:你不能指定多个ResultPath值,因为它没有意义。亚马逊在解释它是如何工作的方面做得很糟糕,所以我明白为什么这会让人困惑。

但是,您可以从状态机中的状态返回多个结果值。

一般细节

任何 State 的输入都是 JSON 对象。State 的输出是一个 JSON 对象。

ResultPath指示状态机如何处理状态的输出(结果)。如果不指定ResultPath,则默认情况下,$这意味着状态的所有输入都将丢失,由状态的输出代替。

如果您想允许来自输入 JSON 的数据通过您的 State,您可以指定 aResultPath来描述要在输入 JSON 上添加/覆盖以传递到下一个 State 的属性。

你的场景

在您的情况下,$.value1意味着您的状态的输出 JSON 是具有新/覆盖属性的输入 JSON,该属性value1包含您的 lambda 的输出 JSON。

如果您希望输出中有多个值,您的 lambda 应该返回一个包含多个值的 JSON 对象,这将是value1属性的值。

如果您不关心允许输入值通过您的状态,请将其保留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有效使用。

于 2018-02-01T02:37:52.577 回答
2

您不能在 ResultPath 中指定多个值,因为 ResultPath 定义了 json 中结果值的路径。与 ResultPath 最接近的类比是return函数的值,因为您的步骤只能返回 1 个值,它应该放入结果 json 中的 1 个节点中。

如果你有一个输入 json

{
  "myValue": "value1",
  "myArray": [1,2,3]
}

并将您的 ResultPath 定义为$.myResult整体生成的 json

{
  "myValue": "value1",
  "myArray": [1,2,3],
  "myResult": "result"
}

现在您可以使用 OutputPath 截断此 json 以仅将其一部分传递给函数的下一步(例如 OutputPath: "$.myResult")

InputPath 和 OutputPath 在其定义中可以有多个节点,但 ResultPath 应该始终只有1 个节点。

于 2017-12-18T00:18:00.413 回答
0

好像今天可以通过使用来完成ResultsSelector

于 2022-01-25T19:56:23.580 回答
-1

我认为它会像下面这样,但我实际上并没有这样做,所以我不能肯定地说。

"ResultPath": {

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

=====

在进一步研究之后,我相信没有直接的方法可以做你想做的事。这是一种可以为您提供所需结果的方法。

1) 您将在步骤中省略 InputPath、OutputPath 和 ResultPath。这将意味着所有的 $. 将作为输入传递给您的 step 函数,并且 lambda 函数的所有输出都将存储为 $. 在 lambda 函数中,您可以将结果字段设置为您想要的任何内容。lambda 函数必须在输出时返回修改后的输入。

于 2017-07-06T23:13:12.007 回答