如何在AWS步骤函数中指定多个结果路径值

时间:2017-07-06 18:55:46

标签: amazon-web-services aws-lambda aws-step-functions

我的AWS步骤功能状态格式如下:

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

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

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

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

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

3 个答案:

答案 0 :(得分:21)

让我们直接回答:您无法指定多个ResultPath值,因为它没有意义。亚马逊确实解释了它是如何工作的,所以我理解为什么这会令人困惑。

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

一般细节

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

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

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

您的方案

在您的情况下,$.value1表示您的State的输出JSON是带有新/覆盖属性value1的输入JSON,其中包含lambda的输出JSON。

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

如果您不关心允许输入值通过您的州,请将ResultPath保留为默认$,省略它。包含多个值的输出JSON将是下一个State的输入。

支持方案

这是我用来输入和输出的简单状态机:

{
  "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更新&#34;。

希望这有助于明确如何有效地使用ResultPath

答案 1 :(得分:1)

您无法在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"
}

现在你可以截断这个json,只使用OutputPath将它的一部分传递到函数的下一步(例如OutputPath:“$。myResult”)

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

答案 2 :(得分:0)

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

"ResultPath": {

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

=====

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

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