错误:连接ETIMEDOUT rds lambda

时间:2016-03-08 23:20:42

标签: node.js aws-lambda amazon-rds

我正在尝试使用Lambda函数连接到RDS,但我收到错误:

var mysql = require('mysql');
exports.handler = function(event, context) {   
           //Connect to RDS

var connection = mysql.createConnection({
host     : 'hostname',
user     : 'username',
password : 'password',
database : 'database'

});

connection.connect( function(err)
{
   if (err)
   { 
     throw err;
   }
else 
  {
    console.log('DB connection establish');
  }
  });

 };

我得到的错误是:

START RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae Version: $LATEST

2016-03-08T23:08:06.737Z    9711e650-e582-11e5-af5f-97ba391a42ae    
Error: connect ETIMEDOUT  
  at Connection._handleConnectTimeout (/var/task/node_modules/mysql/lib/Connection.js:412:13)       
      at Socket.g (events.js:180:16)   
    at Socket.emit (events.js:92:17)   
    at Socket._onTimeout (net.js:327:8)     
    at _makeTimerTimeout (timers.js:429:11)   
    at Timer.unrefTimeout [as ontimeout] (timers.js:493:5)    
    --------------------
    at Protocol._enqueue (/var/task/node_modules/mysql/lib/protocol   /Protocol.js:141:48)    
    at Protocol.handshake (/var/task/node_modules/mysql/lib/protocol    /Protocol.js:52:41)      
    at Connection.connect (/var/task/node_modules/mysql     /lib/Connection.js:123:18)     
    at exports.handler (/var/task/exports.js:21:12)     
END RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae        
REPORT RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae  
Duration: 10988.17ms    
Process exited before completing request

4 个答案:

答案 0 :(得分:18)

我遇到了同样的问题并且修复了它。 看来这是stackoverflow上这个问题的最佳搜索结果,我将在这里发布我的解决方案。

这个答案适用于VPC内的RDS实例

  1. 将Lambda函数放在与RDS实例相同的VPC中
  2. 你的lambda执行角色你需要有VPC执行策略 AWSLambdaVPCAccessExecutionRole

  3. 将一个安全组分配给lambda函数

  4. 在附加到RDS实例的安全性中,为mysql / aurora(端口3306)添加入站规则,而不是为IP地址添加它为lambda函数安全组添加它。
  5. 总之,这将lambda放在与RDS相同的VPC中,并赋予lambda函数对MYSQL的入站访问权限,而不管lambda函数的IP是什么。

答案 1 :(得分:2)

我遇到了同样的问题,并在Google上搜索时找到了您的参赛作品,但现在我解决了这个问题。 可悲的是,我不确定,哪个动作实际上解决了它,但检查:

  • 如果您不使用VPC,请查看它是否适用于可公开访问的RDS,至少是出于测试目的
  • 在身份和访问管理区域内授予您的角色(例如lambda_basic_execution)AmazonRDSFullAccess
  • 在数据库实例的RDS概述中,您可以单击所选的安全组进行编辑:在以下窗口中,您可以指定入站和出站流量规则。在我的工作示例中,我允许来自所有端口和所有IP(0.0.0.0/0)的所有流量用于两种方式。当然这不是一个安全的解决方案,但就你的例子而言,我猜你是 - 像我一样 - 只是进入AWS并尝试首先构建工作示例。您可以随时编辑这些规则以逐渐限制流量。我这样做是为了首先通过我自己的计算机测试我对RDS的访问

我没有在lambda函数中设置VPC选项或API端点并通过

建立连接
exports.handler = function(event, context) {
var mysql      = require('mysql');
var connection = mysql.createConnection({
host     : 'hostwithoutport',
user     : 'user',
password : 'password',
database : 'database'
});

connection.query('SELECT * FROM Xy WHERE ID = "1"', function(err, rows) {
if (err) {
console.error('error connecting: ' + err.stack);
context.fail();
return;
}

console.log('connected as id ' + connection.threadId);
context.succeed(rows);
});
};

您也可以采用不同的方式,但请记住始终成功并失败(或完成)lambda函数,最好在语句后面的if子句中。否则,您可能会遇到问题,因为在查询确定结果之前,lambda函数会成功,并且您无法获得正确的结果。如果你不以某种方式结束lambda函数,函数本身会超时,但看起来会有所不同。

还要记住始终结束连接,这是通过直接使用查询来暗示的 - 此方法自行连接和结束。根据我在另一个线程中读到的内容,理论上也可能由于您曾经调用的仍然打开的连接而出现此问题。

答案 2 :(得分:0)

我想补充ajmcgarry的答案,因为它花费了我一些额外的工作来找到解决这个问题所需的东西:

  1. 是的,您需要为Lambda创建一个特殊的角色来访问和 控制VPC,请按照以下页面说明进行操作: https://docs.aws.amazon.com/lambda/latest/dg/vpc-rds-create-iam-role.html
  2. 将此新角色分配给您的Lambda后,您需要使用 运行RDS实例的同一VPC。
  3. 您需要在Lambda函数中使用相同的安全组。 首先,在您的RDS实例中,找到安全组,对其进行修改, 添加入站规则以从任何地方访问数据库端口 测试目的。
  4. 将刚修改的安全组分配给您的 Lambda函数

您需要视觉指示吗?该视频不太长,即使适用于Python,该说明也适用于这种情况:https://www.youtube.com/watch?v=-CoL5oN1RzQ

答案 3 :(得分:0)

对我来说,仅仅是RDS的安全性角色将传入连接限制到我的ip地址,因此自然而然我就可以从本地计算机进行连接,但是一旦我将其公开打开,我的lambda函数就无法连接(就像Scherwin所写的那样,它不是理想的,但是可以用于测试和玩耍)并重新部署了lambda函数(是的,我不得不重新部署相同的代码,不确定是如何影响了它)我的lambda函数能够连接。

不需要,因为我的数据库可以公开访问,所以我需要在同一VPC中包含我的lambda。

不需要需要修改或向我的lambda添加任何安全角色。