将 Lambda 运行时从 Node 8.x 更改为 Node 12.x 后,从 AWS API Gateway 随机获得 502 Bad Gateway 响应

Posted

技术标签:

【中文标题】将 Lambda 运行时从 Node 8.x 更改为 Node 12.x 后,从 AWS API Gateway 随机获得 502 Bad Gateway 响应【英文标题】:Randomly getting 502 Bad Gateway response from AWS API Gateway after changing Lambda runtime from Node 8.x to Node 12.x 【发布时间】: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 上没有。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

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

    Lambda 函数应该返回一个 JSON 响应,如下所述:https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html 其他选项是 IAM 限制。 或者 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 的生产环境中没有发生错误。流量可能足够高以保持数据库连接打开。

感谢大家的帮助。

【讨论】:

我认为我遇到了同样的问题。你查到真相了吗?

以上是关于将 Lambda 运行时从 Node 8.x 更改为 Node 12.x 后,从 AWS API Gateway 随机获得 502 Bad Gateway 响应的主要内容,如果未能解决你的问题,请参考以下文章

将 NodeJS 运行时从 8.10 更新到 10.x 或 12.x - AWS Amplify

Apache Flink:在运行时从外部更改状态参数

node-lambda - TypeError:处理程序不是函数

实现Lambda函数以通过SSM运行命令

AWS Lambda with Node - 将文件保存到 Lambda 的文件系统中

从本地系统而不是S3上运行的node.js应用程序调用AWS Lambda