繁体   English   中英

AWS Step function 参数没有移到下一步

[英]AWS Step function parameters are not moving to the next step

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

下一步是调用 API 网关,它需要使用 URL 中的参数之一。但是,我看到 URL 都没有所需的参数,我实际上也没有将参数获取到该步骤中。 (“输入”:TaskStateEntered 下的 null)

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

"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"
},

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

{
  "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."
}

我在这里错过了什么? 请注意,部分路径是我在步骤 function 执行时输入的值。 ("路径": "/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(什么都不是。)中取出任何东西,并切断除关键有效负载之外的所有内容。

好吧,你没有返回任何东西,所以这不会导致任何东西被发送到下一个任务。

我假设你的传入通风口已经在 Json 中有一个名为 Payload 的密钥,所以你要做的是从你的 lambda 中删除OutputPath 。它不需要返回任何东西,所以它不需要 Output 或结果小路。

接下来,在你的 API 任务中,再次假设你的初始化事件有一个有效负载键,你将有"InputPath": "$.Payload" - 如果你在初始化 json 事件中有你的标题或参数,那么你可以参考那些键在定义的参数部分。

每项 AWS 服务都以事件开始并以事件结束。 每个事件都是 JSON object。(我相信你知道)。 对于 State 机器,这将继续 - State 机器/步骤 Function 只是用于将事件从一个任务传递到下一个任务的 controller。

因此,任何给定的任务都可以有一个 InputPath、OutputPath 或 Result Path——这三个定义参数可以决定哪些值 go 进入任务,哪些值发送到下一个任务。 根据定义,State 机器用于在任务之间维护 State,这些有助于控制“状态”(并且在任何给定时间几乎只有一个“状态”,事件指向下一个任务)

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

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

这三个给你很多控制权。

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

如果您有某个值的 ResultPath 和OutputPath: "$." 您使用包含任务结果的单个键创建一个新的 json object(键是 ResultPath 中设置的定义

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

可以在此处找到更多信息,但它可能会变得非常混乱。

我的快速指南:

ResultPath 本身如果你想 append 数据到事件

ResultPath + OutputPath 相同的值,如果你想切断输入并且只让任务的 output 继续(并且它返回一个 JSON 样式对象)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM