【问题标题】:Randomly getting 502 Bad Gateway response from AWS API Gateway after changing Lambda runtime from Node 8.x to Node 12.x将 Lambda 运行时从 Node 8.x 更改为 Node 12.x 后,从 AWS API Gateway 随机获得 502 Bad Gateway 响应
【发布时间】:2020-05-08 09:48:49
【问题描述】:

由于 AWS Lambda 上的 NodeJS 8.x 运行时已停产,我们将 REST API 的暂存环境移至 NodeJS 12.x..

现在我们注意到,在某些随机时间,从前端 Web 应用程序到 API Gateway 的请求会失败并返回 502。这通常发生在 API 空闲一段时间(几分钟)之后。大多数情况下,这发生在 OPTIONS 或 HEAD 请求中,但这可能是因为它是在一些空闲时间后的第一个请求。 对 API 的任何后续请求都可以正常工作。即使您刷新网站,所有请求都可以顺利通过。

我在 Lambda 上找不到任何日志。

API 网关日志:

"error":  "Internal server error", "ErrorDetail": " "Internal server error"", "errorValidation": "-", "errorResponseType": "INTEGRATION_FAILURE"

我们在 rumtime NodeJS 10.x 上也遇到了同样的问题,但在 NodeJs 8 上没有。

感谢您的帮助!

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda aws-api-gateway


    【解决方案1】:

    让我们看看,根据您提供的信息,可能有三件事:

    1. Lambda 函数应该返回一个 JSON 响应,如下所述:https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html
    2. 其他选项是 IAM 限制。
    3. 或者 lambda 发送一个 JSON,它的 body 参数包含转义的 JSON 数据,如下所示:
     {
      "statusCode": 200,
      "body": "[\"aaa\",\"ccc\",\"ggg\",\"bbb\",\"ddd\"]"
     }
    

    更新:

    您收到关于 OPTION 和 HEAD 操作的错误,这些错误是来自浏览器的飞行前调用以进行 CORS 检查。

    我所做的是:

    执行飞行前 OPTIONS 调用的浏览器确实会一直到后端。见证以下内容:

    {"result":"-err","number":1,"message":"The quantity and/or type of parameters provided is incorrect."}
    

    您看到的是我收到的对 Chrome 的 OPTIONS 飞行前呼叫的响应。这是我的节点应用程序中的自定义 ErrorMessage 处理程序,抱怨您在没有给它正确输入的情况下运行了该应用程序。飞行前的 OPTIONS 调用不发布任何 JSON(很明显),因此应用程序被激怒了。

    我认为它不会影响您的整个应用程序,但可能会从 AWS API GATEWAY 方面解决问题。

    【讨论】:

    • 谢谢。我会仔细看看的。但是,正如我所描述的,错误是随机发生的。对具有相同参数的同一端点的后续请求将通过。
    • 更新了答案,以便更深入地了解您的问题。
    【解决方案2】:

    听起来也像 lambdas 的冷启动 Cold Starts in AWS Lambda

    检查是否有什么可能会增加 lambda 的冷启动时间。

    【讨论】:

    • 我在想这个方向,但我相信请求会等待 lambda 启动。错误响应似乎是即时的。
    • 来自文档:集成失败错误的网关响应。如果未指定响应类型,则此响应默认为 DEFAULT_5XX 类型。 docs.aws.amazon.com/apigateway/latest/developerguide/…能否尝试指定响应类型?
    【解决方案3】:

    看起来我们发现了错误 - 它在代码中。 :)

    一段时间后,我们在 Cloud Watch 上找到了与 API Gateway 的日志匹配的 Lambda 日志,并且我们看到了一些数据库超时。我们仍在调查细节,但问题在于用于记录的快速中间件。

    即使在 OPTIONS 和 HEAD 请求中以及在确保数据库连接处于活动状态之前,它也在访问数据库。该问题可能与数据库套接字超时和 Lambda 寿命有关。然而,简单的尝试捕获日志中间件显然解决了这个问题。

    我们仍然不确定,为什么在使用 Node 8 的生产环境中没有发生错误。流量可能足够高以保持数据库连接打开。

    感谢大家的帮助。

    【讨论】:

    • 我认为我遇到了同样的问题。你查到真相了吗?
    猜你喜欢
    • 2017-08-08
    • 2019-09-15
    • 1970-01-01
    • 2019-08-24
    • 2020-10-24
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多