我配置了 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 的布尔值。

此页内容对您是否有帮助? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS 支持中心

发布时间:2017 年 10 月 16 日

更新时间:2019 年 1 月 21 日