2016-03-08 81 views
6

我想RDS使用lambda函数连接,但我得到一个错误:错误:连接ETIMEDOUT 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 

回答

2

我同样的问题,并发现您的条目,而谷歌搜索,但现在我解决了它。 可悲的是我不肯定肯定,这实际上采取行动解决它,但检查:

  • 如果你不使用的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函数,则函数本身会超时,但看起来不同。

还记得始终结束连接,这是直接使用查询隐含 - 这种方法连接和结束本身。根据我在另一个线程中读到的内容,理论上这个问题也可能由于您曾经调用过的仍然打开的连接而发生。

11

我遇到了同样的问题,只是把它修好了。 鉴于这是在stackoverflow上这个问题的最佳搜索结果,我将在这里发布我的解决方案。

这个答案是一个VPC

  1. 场所内的RDS实例的lambda函数在同一VPC为您的RDS实例
  2. 你的,你需要有VPC执行添加到它的Lambda执行的角色IAM
  3. 将安全组分配给lambda函数
  4. 在附加到RDS实例的安全性中,为mysql/aurora添加入站规则(端口3306),而不是将其添加到IP地址中将其添加到您的lambda功能安全组。

总之,这将lambda放在与RDS相同的VPC中,并且不管lambda函数的IP如何,都给lambda函数入站访问MYSQL。

+0

这解决了我的超时问题。谢谢! – SexxLuthor