将 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
node-lambda - TypeError:处理程序不是函数