错误:连接ETIMEDOUT rds lambda

我正尝试使用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 

我有这个问题,只是把它修好了。 看到这是在stackoverflow这个问题的顶部search结果,我要发布我的解决scheme在这里。

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

  1. 将Lambda函数放置在与您的RDS实例相同的VPC中
  2. 您的lambda执行angular色您将需要在IAM中添加VPC执行
  3. 将一个安全组分配给lambda函数
  4. 在附加到RDS实例的安全性中,为mysql / aurora(端口3306)添join站规则,而不是将其添加到IP地址,而是将其添加到您的lambda函数安全组。

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

我有同样的问题,并发现您的条目,而现在我用Googlesearch解决了。 可悲的是我不确定,哪个行动实际上解决了,但检查:

  • 如果您不使用VPC,请至less出于testing目的查看它是否适用于可公开访问的RDS
  • 在“身份和访问pipe理”区域中授予您的angular色(例如lambda_basic_execution)AmazonRDSFullAccess
  • 在数据库实例的RDS概述中,您可以单击选定的安全组进行编辑:在以下窗口中,您可以指定入站和出站stream量规则。 在我的工作示例中,我允许来自所有端口和所有IP(0.0.0.0/0)的所有stream量。 当然,这不是一个安全的解决scheme,但是就你的例子而言,我想你就是像我一样,只是进入AWS并试图首先构build工作示例。 您以后可以随时编辑这些规则,逐渐限制stream量。 我首先通过我自己的电脑testing了我对RDS的访问

我在没有在lambda函数中设置VPC选项或API端点的情况下工作,并build立了一个连接

 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函数, 函数本身将超时,但是看起来不同。

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