从 Lambda 函数(节点)连接到 MySQL 数据库
Posted
技术标签:
【中文标题】从 Lambda 函数(节点)连接到 MySQL 数据库【英文标题】:Connect to MySQL database from Lambda function (Node) 【发布时间】:2018-03-29 12:11:52 【问题描述】:我无法使用 Lambda 函数中的 Node 连接到 mysql 数据库。我收到的错误是Task timed out after 4.00 seconds
。
有人有解决办法吗?
以下是我的状态概览:
-
AWS RDS 数据库是 MySQL 数据库。它不仅限于 VPC(我可以使用 MySQLWorkbench 中的主机/用户/密码进行连接)。
我的 Lambda 函数的执行角色设置为将 Lambda 作为受信任的实体并授予管理员访问权限。
在我的本地机器上,我安装了 mysql 模块,压缩了我的 index.js 和 node_modules 文件夹,然后上传到我的 Lambda 函数。
我已尝试将 createConnection 和 connect 函数放入处理程序中。我尝试将我的查询放在连接函数的回调函数中。我已尝试将超时时间增加到 10 秒。
我的代码:
var mysql = require('mysql');
var connection = mysql.createConnection(
host : 'amazon-string.rds.amazonaws.com',
user : 'myusername',
password : 'mypassword'
);
connection.connect();
exports.handler = (event, context, callback) =>
connection.query("SELECT * FROM table", function(err, rows, fields)
console.log("rows: " + rows);
callback(null);
);
;
【问题讨论】:
AWS Lambda RDS connection timeout的可能重复 【参考方案1】:将超时时间增加到一分钟。这可能是由于 lambda 函数的冷启动。
只有您的第一次通话需要时间,连续通话应该非常快,因为您正在重复使用相同的连接。
另外,超时时间更长并不意味着您需要为该超时付费,您只需为 Lambda 运行的时间付费。
还可以加快 冷启动 时间,您可以 webpack 脚本,
http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/webpack.html
还有一个问题,
var mysql = require('mysql');
var connection = mysql.createConnection(
host : 'amazon-string.rds.amazonaws.com',
user : 'myusername',
password : 'mypassword'
);
connection.connect();
exports.handler = (event, context) =>
connection.query("SELECT * FROM table", function(err, rows, fields)
console.log("rows: " + rows);
context.succeed('Success');
);
;
希望对你有帮助。
【讨论】:
感谢您的回复!看起来这解决了一个问题!现在我遇到了一个新的超时问题:connect ETIMEDOUT
。我已将 Lambda 超时时间增加到 5 分钟,并且已将 'connectTimeout': 3000000
添加到我的 createConnection 对象中,但它仍然会发生。
删除回调并使用 context.succeed,这是我得到的唯一区别。
感谢卡奈扬。我终于得到了这个工作。感谢您的帮助。
如果解决了您的问题,您可以接受它作为答案。
我使用了context.callbackWaitsForEmptyEventLoop = false;
,它对我有用【参考方案2】:
由于您使用的是 RDS,请查看它的安全组配置。默认情况下,RDS 的安全组将允许来自您自己的 IP 和默认 VPC 上的默认安全组的入站连接。但是 Lambda 默认在无 VPC 下运行,因此无法与 RDS 建立连接。
要么更改您的 RDS 实例以允许所有 IP 地址,要么在您的 RDS 实例可以访问的 VPC 下执行您的 Lambda 函数,并允许访问安全组。
【讨论】:
以上是关于从 Lambda 函数(节点)连接到 MySQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章
AWS Lambda 上的节点函数无法使用 node-pg 连接到数据库
无法从 AWS Lambda 连接到 AWS RDS MySql DB。 ClassNotFoundException:com.mysql.jdbc
Lambda 在本地连接到 Aurora MySql - 部署到 AWS 时超时
如何从 AWS SAM 本地 docker 实例连接到主机 MySQL?