我的AWS步骤功能状态格式如下:
"MyState": {
"Type": "Task",
"Resource": "<MyLambdaARN>",
"ResultPath": "$.value1"
"Next": "NextState"
}
我想添加第二个值,但无法找到任何地方。 AWS示例均未显示要添加到输出的多个ResultPath值。
我会在它们之间添加一个逗号吗?
"MyState": {
"Type": "Task",
"Resource": "<MyLambdaARN>",
"ResultPath": "$.value1, $.value2"
"Next": "NextState"
}
或者有更好的格式化方法吗?
答案 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函数必须在输出时返回修改后的输入。