AWS Step Functions:将任务输入与* partial *任务输出结合

时间:2020-02-25 15:49:20

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

我正在使用AWS Step函数。我已经阅读了InputPath, OutputPath, and ResultPath上的文档。我的问题是我想将 input 到Lambda Task的值与任务的 partial output 组合起来。

该任务的输入类似于以下内容。我想继续将这些值传递给后续任务。

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

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

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

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

{
  "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节点。

2 个答案:

答案 0 :(得分:4)

使用Lambda任务状态时,可以通过3种方法来构造任务状态:

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 Functions将同步调用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的调用(此方法将仅从SendTaskSuccess或SendTaskFailed返回结果/错误,而没有其他HTTP元数据)。

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

答案 1 :(得分:2)

对于现在发现此问题的任何人,ResultSelector(自8/2020起为新功能)完全符合我在发布此消息时所寻找的功能。

InputPath, Parameters and ResultSelector