【问题标题】:AWS Step Functions: Combine task input with *partial* task outputAWS Step Functions:将任务输入与 *partial* 任务输出相结合
【发布时间】:2020-02-25 15:49:20
【问题描述】:

我正在研究 AWS Step 函数。我已经阅读了InputPath, OutputPath, and ResultPath 上的文档。我的问题是我想将 input 中的值与任务的 部分输出 组合到 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 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 节点的方法来自现有输入的结果。

【问题讨论】:

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


    【解决方案1】:

    使用 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 指定为资源时,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
    }
    

    【讨论】:

    • AWS Step Functions 中的 Lamda 是否不支持 syncdocs.aws.amazon.com/step-functions/latest/dg/…你能做到吗?如果是这样,您是否使用了ServiceIntergation.sync
    • Lambda 不支持 .sync 集成模式,因此您不能使用 arn:aws:states:::lambda:invoke.sync。然而,如上所述的选项 1(通过将 InvocationType 指定为 RequestResponse)和选项 2(InvocationType 默认为 RequestResponse)都允许您同步调用 lambda 函数。
    【解决方案2】:

    对于现在发现此内容的任何人,ResultSelector(自 2020 年 8 月起新增)执行的功能正是我在发布此内容时所寻找的功能。

    InputPath, Parameters and ResultSelector

    【讨论】:

      猜你喜欢
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      相关资源
      最近更新 更多