从 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?

我应该如何从 AWS Lambda 函数连接到 Redis 实例?

从 WCF 连接到 MySQL 集群