use*_*327 12 amazon-rds node.js aws-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');
}
});
};
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
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
Run Code Online (Sandbox Code Playgroud)
ajm*_*rry 19
我有同样的问题,只是解决了它.看来这是stackoverflow上这个问题的最佳搜索结果,我将在这里发布我的解决方案.
此答案适用于VPC内的RDS实例
你的lambda执行角色需要有VPC执行策略
AWSLambdaVPCAccessExecutionRole
将一个安全组分配给lambda函数
总之,这将lambda放在与RDS相同的VPC中,并且无论lambda函数的IP如何,都为lambda函数提供对MYSQL的入站访问.
我遇到了同样的问题,并在谷歌搜索时找到了您的条目,但现在我解决了。遗憾的是,我不确定哪个操作真正解决了这个问题,但请检查:
我无需在 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);
});
};
Run Code Online (Sandbox Code Playgroud)
您也可以采用不同的方式,但请记住 lambda 函数始终成功和失败(或完成),最好在语句后的 if 子句内。否则,您可能会遇到问题,因为 lambda 函数在查询确定结果之前就成功,并且您无法获得正确的结果。如果您不以某种方式结束 lambda 函数,函数本身就会超时,但看起来会有所不同。
还要记住始终结束连接,这是通过直接使用查询来暗示的 - 此方法自行连接和结束。根据我在不同线程中读到的内容,理论上也可能由于您曾经调用的连接仍然打开而发生此问题。
| 归档时间: |
|
| 查看次数: |
9460 次 |
| 最近记录: |