如何使用 Lambda 代理集成解决来自 API Gateway REST API 的 HTTP 502 错误?

2 分钟阅读
0

我将 Amazon API Gateway 代理集成配置为与 AWS Lambda 函数配合使用。当我调用 REST API 时,我收到了配置错误和 HTTP 502 状态码。我该如何解决此问题?

简短描述

如果您的 Lambda 函数权限不正确或对 API 请求的响应格式不正确,则 API 网关会返回 HTTP 502 状态码。

Amazon CloudWatch Logs 中显示的 HTTP 502 错误消息示例

Wed Aug 03 08:10:00 UTC 2022 : Execution failed due to configuration error:
WE Aug 03 09:10:00 UTC 2022 : Method completed with status: 502

-或-

Wed Aug 03 08:20:33 UTC 2022 : Lambda execution failed with status 200 due to customer function error: [Errno 13] Permission denied: '/var/task/lambda_function.py'. Lambda request id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Wed Aug 03 08:20:33 UTC 2022 : Method completed with status: 502

为了让 API 网关处理 Lambda 函数的响应,该函数必须根据以下 JSON 格式返回输出:

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

有关更多信息,请参阅 Output format of a Lambda function for proxy integration

解决方案

1.使用 API Gateway 中的 API 控制面板,查看您的 REST API 的 CloudWatch 指标。
-或-
在 Amazon CloudWatch 控制台中查看您的 REST API 的日志事件

2.在日志中,查看 Lambda 函数对您的 API 的响应格式。如果响应不是所需的 JSON 格式,则重新设定格式。

3.验证 Lambda 函数的资源策略是否允许访问通过 API 网关调用该函数。

4.如果由于软件包权限问题导致 Lambda 函数执行失败,则验证该权限。有关更多信息,请参阅我在上传 Lambda 部署包时遇到“permission denied”或“unable to import module”错误,如何进行问题排查?

5.验证 Lambda 函数处理程序名称和配置是否有效

6.如果 Lambda 在运行时执行失败,请检查 Lambda 函数日志并更新代码。

7.进行更改后,您可以在 API 网关控制台中测试您的 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 转换为字符串。
    **注意:**您可以使用 JSON.stringify,在 Node.js 函数中处理这个问题。其他运行时需要不同的解决方案,但概念是一样的。
  • 如果您使用的是二进制数据,则 isBase64 编码是必填字段。如果您不使用此字段,则最佳做法是将该值设置为** FALSE**。

相关信息

Setting up CloudWatch logging for a REST API in API Gatewa

Monitoring REST APIs with Amazon CloudWatch metrics

AWS 官方
AWS 官方已更新 2 年前