如何在 AWS Step Functions 中指定多个结果路径值

How to specify multiple result path values in AWS Step Functions

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

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

我想添加第二个值,但不知道如何添加。 None 的 AWS 示例显示添加到输出的多个 ResultPath 值。

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

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

或者有更好的格式化方法吗?

我觉得应该是下面这样,但是我没有实际做过所以不能肯定地说。

"ResultPath": {

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

=====

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

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

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

的 1 个节点中

如果你有输入json

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

并将您的 ResultPath 定义为 $.myResult 总体结果 json 将是

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

现在您可以使用 OutputPath(例如 OutputPath: "$.myResult")

截断此 json 以仅将它的一部分传递给函数中的下一步

InputPath 和 OutputPath 在它们的定义中可以有多个节点,但 ResultPath 应该总是只有 1 个节点。

让我们直接回答这个问题:您不能指定多个 ResultPath 值,因为它没有意义。亚马逊在解释其工作原理方面确实做得很糟糕,所以我理解为什么这令人困惑。

但是,您可以 return 来自状态机中一个状态的多个结果值。

一般详情

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

ResultPath 指示状态机如何处理状态的输出(结果)。如果不指定 ResultPath,则默认为 $,这意味着所有对 State 的输入都将丢失,取而代之的是 State 的输出。

如果你想允许来自输入 JSON 的数据通过你的状态,你指定一个 ResultPath 来描述输入上的 属性 到 add/overwrite JSON 传递到下一个状态。

您的场景

在你的情况下,$.value1 意味着你的状态的输出 JSON 是输入 JSON 带有 new/overwritten 属性 value1包含 lambda 的输出 JSON。

如果你想在你的输出中有多个值,你的 lambda 应该 return 一个包含多个值的 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 是 "updated".

希望这能阐明如何有效地使用 ResultPath

今天好像可以用ResultsSelector.