如何解决 API Gateway 的“malformed Lamda proxy response”或 502 状态代码?

上次更新时间:2020 年 10 月 30 日

我配置了 Amazon API Gateway 代理集成以用于一个 AWS Lambda 函数。在调用我的 API 时,我收到了一条配置错误或 502 状态代码。如何解决此问题?

简短描述

此类错误的源头往往在于 Lambda 函数的应答格式。如果格式有问题,则您将在日志中看到与以下类似的消息:

Thu Dec 08 01:13:00 UTC 2016 : Execution failed due to configuration error: Malformed Lambda proxy response
Thu Dec 08 01:13:00 UTC 2016 : Method completed with status: 502

要让 API Gateway 处理 Lambda 函数的应答,应答必须为 JSON 格式:

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

有关更多信息,请参阅用于代理集成的 Lambda 函数的输出格式

解决方法

  1. API Gateway 控制台检查日志输出,或者在 Amazon CloudWatch 控制台查看 API Gateway 日志事件
  2. 在日志中,检查 Lambda 函数对您的 API 作出的应答格式。如果应答格式非正确的 JSON,则调整其格式。

应答格式正确的 Node.js 示例函数

exports.handler = (event, context, callback) => {

    var responseBody = {
        "key3": "value3",
        "key2": "value2",
        "key1": "value1"
    };

    var response = {
        "statusCode": 200,
        "headers": {
            "my_header": "my_value"
        },
        "body": JSON.stringify(responseBody),
        "isBase64Encoded": false
    };
    callback(null, response);
};

注意:如果函数采用其他编程语言编写,则请参阅相关语言的编程参考。确认函数返回正确格式的应答。

此应答中共有四个字段:statusCodeheadersbodyisBase64Encoded

  • statusCode 是一个整数,由 API Gateway 解释,返回至 API 方法的发起人。
  • headers 使用 API Gateway 应答采集和发回。
  • 如果您返回 JSON,则 body 字段必须转换为一个字符串,以防止应答进一步出现问题。请在 Node.js 函数中使用 JSON.stringify 来处理此操作。其他运行时需要不同的解决方法,但概念是相同的。
  • isBase64Encoded 字段对于二进制数据的处理十分重要。如果您不使用此字段,则最好将其设置为 FALSE 布尔值。