如何在 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
.
我有一个 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.
如果你有输入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
.