如何解决 API Gateway REST API 的 HTTP 502“Malformed Lambda proxy response”错误?

上次更新日期:2021 年 11 月 18 日

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

简短描述

如果您的 Lambda 函数对 API 请求的应答格式不正确,API Gateway 就将返回 HTTP 502 状态代码。

示例 HTTP 502“Malformed Lambda proxy response”错误消息显示在 Amazon CloudWatch Logs 中

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 中的 API 控制面板查看 REST API 的 CloudWatch 指标。
– 或者 –
在 Amazon CloudWatch 控制台中查看您的 REST API 的日志事件

2.    在日志中,查看 Lambda 函数对您的 API 作出的应答格式。如果应答未采用所需的 JSON 格式,请重新格式化它。

3.    在 API Gateway 控制台中测试您的 REST API 方法

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

注意:Node.js Lambda 函数支持异步处理程序非异步处理程序。以下示例函数使用异步处理程序。

exports.handler = async (event) => {

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

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

    return response;
};

在此示例响应中,有四个字段:

  • statusCode 是一个整数,由 API Gateway 解释,返回至 API 方法的发起人。
  • headers 使用 API Gateway 应答采集和发回。
  • 如果要以 JSON 格式返回数据,则必须将 body 转换为字符串。
    注意:您可以在 Node.js 函数中使用 JSON.stringify 来处理此操作。其他运行时需要不同的解决方法,但概念是相同的。
  • 如果正在使用二进制数据,则 isBase64Encoded 是必填字段。如果未使用此字段,最佳实践是将值设置为 FALSE