我正在尝试使用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
答案 0 :(得分:18)
我遇到了同样的问题并且修复了它。 看来这是stackoverflow上这个问题的最佳搜索结果,我将在这里发布我的解决方案。
这个答案适用于VPC内的RDS实例
你的lambda执行角色你需要有VPC执行策略
AWSLambdaVPCAccessExecutionRole
将一个安全组分配给lambda函数
总之,这将lambda放在与RDS相同的VPC中,并赋予lambda函数对MYSQL的入站访问权限,而不管lambda函数的IP是什么。
答案 1 :(得分:2)
我遇到了同样的问题,并在Google上搜索时找到了您的参赛作品,但现在我解决了这个问题。 可悲的是,我不确定,哪个动作实际上解决了它,但检查:
我没有在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的答案,因为它花费了我一些额外的工作来找到解决这个问题所需的东西:
您需要视觉指示吗?该视频不太长,即使适用于Python,该说明也适用于这种情况:https://www.youtube.com/watch?v=-CoL5oN1RzQ
答案 3 :(得分:0)
对我来说,仅仅是RDS的安全性角色将传入连接限制到我的ip地址,因此自然而然我就可以从本地计算机进行连接,但是一旦我将其公开打开,我的lambda函数就无法连接(就像Scherwin所写的那样,它不是理想的,但是可以用于测试和玩耍)并重新部署了lambda函数(是的,我不得不重新部署相同的代码,不确定是如何影响了它)我的lambda函数能够连接。
我不需要,因为我的数据库可以公开访问,所以我需要在同一VPC中包含我的lambda。
我不需要需要修改或向我的lambda添加任何安全角色。