AWS Step 函数参数不会移动到下一步

AWS Step function parameters are not moving to the next step

我是 运行 一个包含许多不同步骤的阶跃函数,但我仍然停留在第二步。 第一步是 Java Lambda,它获取所有输入参数并执行它需要执行的操作。 lambda return 为空,因为它不需要 return 任何东西。

下一步是调用 API 网关,需要使用 URL 中的参数之一。 但是,我看到 URL 既没有所需的参数,也没有实际将参数放入步骤中。 (“输入”:TaskStateEntered 下为空)

API 网关步骤如下所示:(我还尝试了 "Payload.$": "$" 而不是 " 输入.$": "$")

"API Gateway start": {
  "Type": "Task",
  "Resource": "arn:aws:states:::apigateway:invoke",
  "Parameters": {
    "Input.$": "$",
    "ApiEndpoint": "aaaaaa.execute-api.aa-aaaa-1.amazonaws.com",
    "Method": "GET",
    "Headers": {
      "Header1": [
        "HeaderValue1"
      ]
    },
    "Stage": "start",
    "Path": "/aaa/aaaa/aaaaa/aaaa/$.scenario",
    "QueryParameters": {
      "QueryParameter1": [
        "QueryParameterValue1"
      ]
    },
    "AuthType": "IAM_ROLE"
  },
  "Next": "aaaaaa"
},

但是当我的步骤函数到达这个阶段时它失败了,我在日志中看到以下内容:

{
  "name": "API Gateway start",
  "input": null,
  "inputDetails": {
    "truncated": false
  }
}

最终:

{
  "error": "States.Runtime",
  "cause": "An error occurred while executing the state 'API Gateway start' (entered at the event id #9). Unable to apply Path transformation to null or empty input."
}

我在这里错过了什么?请注意,部分路径是我在步骤函数执行时输入的值。 ("路径": "/aaa/aaaa/aaaaa/aaaa/$.scenario")

编辑:

应@lynkfox 的要求,我添加了 API 网关步骤之前的 lambda 定义: 回答这个问题,是的,它是标准的,我没有看到任何输入。

  "Run tasks": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$.Payload",
      "Parameters": {
        "Payload.$": "$",
        "FunctionName": "arn:aws:lambda:aaaaaa-1:12345678910:function:aaaaaaa-aaa:$LATEST"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "Next": "API Gateway start"
    },

所以是的,正如我评论的那样,我认为问题出在您的 lambda 任务定义的 OutputPath 上。这就是说,从这个 lambda 中取出任何东西(这没什么!)并切断除关键有效负载之外的所有东西。

嗯,你 return 什么都没有,所以这不会导致任何东西被发送到下一个任务。

我假设你的传入通风口在 Json 中已经有一个名为 Payload 的键,所以你要做的是从你的 lambda 中删除 OutputPath。它不需要 return 任何东西,因此它不需要输出或结果路径。

接下来,在你的 API 任务中,再次假设你的初始化事件有一个有效负载键,你会有 "InputPath": "$.Payload" - 如果你有你的 headers 或参数初始化 json 事件然后,您可以在定义的参数部分引用这些键。

每项 AWS 服务都以事件开始并以事件结束。每个事件都是 JSON object。 (我相信你知道)。对于状态机,这会继续 - 状态 Machine/Step 函数只是将事件从一个任务传递到下一个任务的控制器。

所以任何给定的任务都可以有一个 InputPath、OutputPath 或 Result Path - 这三个定义参数可以决定哪些值进入任务,哪些值发送到下一个任务。根据定义,状态机用于维护任务之间的状态,这些有助于控制 'State'(并且在任何给定时间几乎只有一个 'state',事件前往下一个任务(s )

ResultPath 是任务在整个事件中放置数据的位置。如果您单独放置 ResultPath: "$.MyResult",它 会将此键附加到传入事件

如果您添加 OutputPath,它只会将该键从任务的输出事件传递到 Step Functions 的下一步。

这三个给你很大的控制权。

想要将事件带入 Lambda 并以完全不同的方式响应 - 您不需要传入数据 - 您将 OutputPath 和 ResultPath 组合为相同的值(并且您的 Lambda 需要以 Json Object) 然后就可以批发更换活动了。

如果你有一些值的 ResultPath 并且 OutputPath: "$." 你创建一个新的 json object 带有一个包含你的任务结果的键(键是定义集在结果路径中

InputPath 允许您设置进入任务的内容。我不是 100% 确定,但我很确定它不会从链中的下一个任务中删除任何内容。

可以找到更多信息 here,但它可能会让人很困惑。

我的快速指南:

ResultPath 本身,如果你想将数据附加到事件

ResultPath + OutputPath 相同的值,如果你想切断输入,只让任务的输出继续(并且它 return 是 JSON 风格 object)