AWS步骤功能:将任务输入与*部分*任务输出相结合



我正在研究AWS Step函数。我已经阅读了关于InputPath、OutputPath和ResultPath的文档。我的问题是,我想将输入到Lambda任务的值与该任务的部分输出组合在一起。

任务的输入如下所示。我想继续将这些值传递给后续任务。

{
"previous_task_result": 100,
"next_task_input": "asdf"
}

我想要的是,让我的Lambda任务的输出看起来像这样:

{
"previous_task_result": 100,
"next_task_input": "asdf",
"current_task_result": {
"val1": "ghjk",
"val2": [0,2,13,100]
}
}

具体的问题是Lambda任务的原始输出看起来是这样的。我只关心Payload节点。其余的输出都是样板,我宁愿不通过Step函数。

{
"resourceType": "lambda",
"resource": "invoke",
"output": {
"ExecutedVersion": "$LATEST",
"Payload": {
"val1": "ghjk",
"val2": [0,2,13,100]
},
"SdkHttpMetadata": {
"HttpHeaders": {
"Connection": "keep-alive",
"Content-Length": "42",
"Content-Type": "application/json",
"Date": "Tue, 25 Feb 2020 14:36:29 GMT",
"X-Amz-Executed-Version": "$LATEST",
"x-amzn-Remapped-Content-Length": "0"
},
"HttpStatusCode": 200
},
"SdkResponseMetadata": {
"RequestId": "redacted"
},
"StatusCode": 200
}
}

我知道如何使用ResultPathOutputPath将输入与输出相结合,或将输出分配给特定节点,但我找不到一种方法将结果中的Payload节点与现有输入合并。

使用Lambda任务状态时,有三种方法可以构建任务状态:

1.请求响应:

此方法返回完整的API响应,包括SdkHttpMetadata字段。我怀疑返回完整HTTP响应的原因是因为这是从Step function异步调用Lambda函数的唯一方法(异步Lambda调用只返回状态代码(。示例:

"CallLambda": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "MyFunction",
"InvocationType": "Event|RequestResponse|DryRun",
"Payload.$": "$"
},
"End": true
}

2.Lambda ARN作为资源:

我相信这就是你想要的。将Lambda函数的ARN指定为Resource时,Step函数将同步调用Lambda函数,并仅返回Lambda函数中的结果,而不返回API响应元数据。在这种情况下,您的状态输入将作为有效载荷传递给Lambda函数,或者您可以使用InputPath/Parameters来过滤/修改作为有效载荷发送的数据。

"CallLambda": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
"ResultPath": "$.current_task_result",
"End": true
}

使用您的例子中的输入,上面的任务将为您提供如下输出:

{
"previous_task_result": 100,
"next_task_input": "asdf",
"current_task_result": {
<Your Lambda Functions Result>
}
}

3.WaitForTaskToken:

将令牌传递给您的函数,暂停执行,直到收到对SendTaskSuccess或SendTaskFailed的调用为止(此方法将只返回SendTaskSuc成功或SendTaskFailed的Result/Error,而不返回其他HTTP元数据(。

"CallLambda": {
"Type": "Task",
"Resource":"arn:aws:states:::lambda:invoke.waitForTaskToken",
"Parameters": {
"FunctionName": "MyFunction",
"Payload":{  
"token.$":"$$.Task.Token"
}
},
"End": true
}

对于现在发现这一点的人来说,ResultSelector(2020年8月的新版本(执行的功能正是我发布这一消息时想要的。

输入路径、参数和结果选择器

最新更新