【问题标题】:AWS Step Function Lambda Returning Null Output PayloadAWS Step Function Lambda 返回空输出负载
【发布时间】:2021-01-16 09:33:27
【问题描述】:

我创建了一个运行 lambda 的基本状态机,然后使用该 lambda 的输出来决定选择。但是,我无法接收 lambda 函数的输出,因为它一直返回空有效负载。我尝试从 lambda 控制台单独运行 lambda,它运行良好(包括预期的回报)。但是,在 step 函数中,任务至少为 Payload 输出返回 null。

这是我的状态机的定义:

{
  "StartAt": "ValidateWorkcellConfigTask",
  "States": {
    "ValidateWorkcellConfigTask": {
      "Next": "ConfigValidationTypeChoiceState",
      "Parameters": {
        "FunctionName": "ValidateWorkcellConfig",
        "InvocationType": "Event",
        "Payload.$": "$"
      },
      "OutputPath": "$",
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "TimeoutSeconds": 15
    },
    "ConfigValidationTypeChoiceState": {
      "Type": "Choice",
      "Comment": "Forwards a VALID workflow config to the Provisioning Workflow or Relays the INVALID workflow config for logging",
      "Choices": [
        {
          "Variable": "$.uuid",
          "StringEquals": "SEA90-1",
          "Next": "endState"
        },
        {
          "Variable": "$.validConfig",
          "StringEquals": "SEA90-1",
          "Next": "SuccessRelayTask"
        }
      ]
    },
    "endState": {
      "Type": "Pass",
      "End": true
    },
    "SuccessRelayTask": {
      "End": true,
      "Parameters": {
        "FunctionName": "StatusRelayHandler",
        "InvocationType": "Event",
        "Payload.$": "$"
      },
      "OutputPath": "$",
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "ResultPath": "$",
      "TimeoutSeconds": 15
    }
  }
}

这是 lambda 任务执行的输出:

{
  "name": "ValidateWorkcellConfigTask",
  "output": {
    "Payload": null,
    "SdkHttpMetadata": {
      "AllHttpHeaders": {
        "x-amzn-Remapped-Content-Length": [
          "0"
        ],
        "Connection": [
          "keep-alive"
        ],
        "x-amzn-RequestId": [
          "4452a8d2-e607-4ae6-943c-9478b0f59ce0"
        ],
        "Content-Length": [
          "0"
        ],
        "Date": [
          "Sat, 16 Jan 2021 09:22:48 GMT"
        ],
        "X-Amzn-Trace-Id": [
          "root=1-6002b068-52fb3d1f60f20d3e10804f96;sampled=0"
        ]
      },
      "HttpHeaders": {
        "Connection": "keep-alive",
        "Content-Length": "0",
        "Date": "Sat, 16 Jan 2021 09:22:48 GMT",
        "x-amzn-Remapped-Content-Length": "0",
        "x-amzn-RequestId": "4452a8d2-e607-4ae6-943c-9478b0f59ce0",
        "X-Amzn-Trace-Id": "root=1-6002b068-52fb3d1f60f20d3e10804f96;sampled=0"
      },
      "HttpStatusCode": 202
    },
    "SdkResponseMetadata": {
      "RequestId": "4452a8d2-e607-4ae6-943c-9478b0f59ce0"
    },
    "StatusCode": 202
  },
  "outputDetails": {
    "truncated": false
  }
}

注意负载是如何为空的……这导致下一个任务失败,因为它接收到一个空输入。我已经玩过 OutputPath、ResultPath 和 InputPath,但从来没有能够从 lambda 任务中返回一些东西。

lambda 本身是用 Java 编写的,并返回一个字符串。它实现了这个接口:

... implements RequestHandler<WorkcellConfig, String>

【问题讨论】:

  • 状态机定义包含"FunctionName": "ValidateWorkcellConfig" - 这也是你的真实配置吗?因为您应该在此处定义函数 ARN,而不仅仅是函数名称。
  • 你能分享你的 lambda 代码吗?看起来您从第一次调用lumigo.io/blog/… 中没有返回任何内容,请在此处查看有关如何设置步进函数的教程
  • 嗨,我也有同样的问题。您能分享一下您是如何解决这个问题的吗?

标签: aws-lambda aws-step-functions


【解决方案1】:

我认为您遇到的问题可能是由于 Invocation Type,您将其设置为 event(异步)所以您给没有时间让 lambda 函数返回结果负载。尝试将其更改为 RequestResponse 以同步运行(这是默认类型,因此您可以省略此参数)。

您可以查看有关调用类型here的更多详细信息。

代码应如下所示:

{
    "StartAt": "ValidateWorkcellConfigTask",
    "States": {
    "ValidateWorkcellConfigTask": {
        "Next": "ConfigValidationTypeChoiceState",
        "Parameters": {
        "FunctionName": "ValidateWorkcellConfig",
        "Payload.$": "$"
        },
        "OutputPath": "$",
        "Type": "Task",
        "Resource": "arn:aws:states:::lambda:invoke",
        "TimeoutSeconds": 15
    },
    "ConfigValidationTypeChoiceState": {
        "Type": "Choice",
        "Comment": "Forwards a VALID workflow config to the Provisioning Workflow or Relays the INVALID workflow config for logging",
        "Choices": [
        {
            "Variable": "$.uuid",
            "StringEquals": "SEA90-1",
            "Next": "endState"
        },
        {
            "Variable": "$.validConfig",
            "StringEquals": "SEA90-1",
            "Next": "SuccessRelayTask"
        }
        ]
    },
    "endState": {
        "Type": "Pass",
        "End": true
    },
    "SuccessRelayTask": {
        "End": true,
        "Parameters": {
        "FunctionName": "StatusRelayHandler",
        "Payload.$": "$"
        },
        "OutputPath": "$",
        "Type": "Task",
        "Resource": "arn:aws:states:::lambda:invoke",
        "ResultPath": "$",
        "TimeoutSeconds": 15
    }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    相关资源
    最近更新 更多