【发布时间】:2016-07-11 09:27:16
【问题描述】:
我正在使用 Lambda 连接到属于 VPC 的 Postgres RDS 实例。如果有一段时间没有调用 Lambda 函数,执行大约 2 分钟后会报如下错误:
could not connect to postgres { [Error: connect ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'connect' }
当 lambda 函数重试时,它成功连接到数据库并按预期执行。
Lambda 函数是使用 node-postgres 包为 node.js 编写的。连接程序如下所示:
var client = new pg.Client(conString);
client.connect(function(err) {
console.log("client connected");
if(err) {
context.fail('Connection failed');
}
else { //do stuff }
}
日志显示它在超时之前从未到达“客户端已连接”。在这些第一次尝试中出了什么问题?
注意:如果 lambda 函数在 20-30 分钟内再次调用,则不会发生此超时并且函数执行成功。
【问题讨论】:
-
我猜它正在尝试重用与数据库的旧连接,但连接已超时。在退出 Lambda 函数之前,您是否致电
client.end()? -
另外,当我使用具有 VPC 访问权限的 Lambda 函数时,我一直在阅读有关 ENI 创建时间的一些问题,这些函数并不经常被调用。如果可以的话,您可能必须增加数据库连接超时时间,以考虑到每当 Amazon 启动您的 Lambda 函数的新实例时获得网络连接所需的额外时间。
-
client.end() 正在被调用,因此没有任何连接处于打开状态。 ENI 创建时间听起来像是一个很好的理论,因为随后的调用或重试没有相同的问题。我将考虑增加数据库超时并将 lambda 函数也设置为最大超时。
-
我遇到了与 Toast 相同的问题,我尝试了 @MarkB 的建议,增加了数据库的超时时间,但似乎没有帮助。
标签: javascript node.js postgresql amazon-web-services lambda