AWS Lambda可以连接到RDS MySQL数据库并更新数据库吗?

45

我正在尝试将AWS Lambda函数连接到RDS MySQL数据库。
我只想从我的Lambda函数更新数据库。是否可以通过指定IAM角色和访问策略来访问RDS?
我可以使用mysql客户端连接到MySQL数据库,但是当我在Lambda上尝试时就无法连接。以下是我的代码:

console.log('Loading function');
var doc = require('dynamodb-doc');
var dynamo = new doc.DynamoDB();
var mysql = require('mysql');
exports.handler = function(event, context) {
    //console.log('Received event:', JSON.stringify(event, null, 2));  
    var operation = event.operation;
    delete event.operation;
    switch (operation) {
        case 'create':
            var conn = mysql.createConnection({
                host: 'lamdatest.********.rds.amazonaws.com', // RDS endpoint 
                user: 'user', // MySQL username 
                password: 'password', // MySQL password 
                database: 'rdslamda'
            });
            conn.connect();
            console.log("connecting...");
            conn.query('INSERT INTO login (name,password) VALUES("use6","password6")', function(err, info) {
                console.log("insert: " + info.msg + " /err: " + err);
            });
            console.log("insert values in to database");
            break;
        case 'read':
            dynamo.getItem(event, context.done());
            break;

        default:
            context.fail(new Error('Unrecognized operation "' + operation + '"'));

    }
    context.succeed();
};

你不能使用IAM角色来访问你的RDS - adamkonrad
那么连接到RDS MySQL的步骤是什么? - ARUNBALAN NV
您需要将RDS设置为公共(非VPC),然后使用其中一个公共主机名来连接它。 - adamkonrad
4个回答

78

是的,您可以从AWS Lambda访问MySql RDS数据库。

您可以使用node-mysql库。

然而,这还带有一个重要的警告。

AWS Lambda(目前)无法访问VPC中的私有子网。因此,为了使AWS Lambda能够访问您的RDS数据库,它必须是公开可访问的,这可能会对您造成安全风险。

更新(2015-10-30):AWS Lambda宣布即将支持VPC(截至2015年re:Invent),因此这不再是问题。

更新(2015-11-17):AWS Lambda仍然没有VPC支持。

更新(2016-02-11):AWS Lambda现在可以访问VPC资源:

https://aws.amazon.com/blogs/aws/new-access-resources-in-a-vpc-from-your-lambda-functions/

为了实现此功能,Lambda函数实际上将在子网内执行。使用此功能需要注意以下几点:

  • VPC子网需要有足够的空闲IP地址来处理Lambda的扩展
  • 如果Lambda函数需要访问Internet,那么它的指定VPC子网将需要一个Internet Gateway或NAT

好的。现在我正在尝试这样做。但是当我尝试在我的 Lambda 函数中包含 MySQL 模块时,会出现错误,就像这样:var mysql= require("mysql");。它显示错误信息为_"errorMessage": "找不到模块 'mysql'"_。 - ARUNBALAN NV
1
那么您没有正确地将模块包含在部署包中。请确保将其包含在ZIP包中(位于“node_modules”子文件夹中)。 - Matt Houser
我包含了一个压缩文件夹,其中包含我的 index.js 文件和 node_modules 文件夹。但是它显示以下错误信息:{ "errorMessage": "Cannot find module 'index'", "errorType": "Error" 等等。 - ARUNBALAN NV
2
这是错误。连接错误:错误:connect ETIMEDOUT 在 Connection._handleConnectTimeout (/var/task/node_modules/mysql/lib/Connection.js:373:13) - ARUNBALAN NV
2
即使受到密码保护,仍然可能会受到MySQL漏洞、DoS等滥用的威胁。防止开放连接更加安全。这完全取决于您所持有的数据。例如,即使受到密码保护,金融机构也永远不会将服务器开放给全世界。 - Matt Houser
显示剩余8条评论

6
请尝试此教程: http://docs.aws.amazon.com/lambda/latest/dg/vpc-rds.html 在这个教程中,您将完成以下步骤:
在默认的Amazon VPC中启动Amazon RDS MySQL数据库引擎实例。
在MySQL实例中,创建一个名为ExampleDB的数据库,并在其中添加一个示例表(Employee)。
创建一个Lambda函数来访问ExampleDB数据库,创建一个表(Employee),添加一些记录,并从表中检索记录。
手动调用Lambda函数并验证查询结果。

4
由于Lambda使用Node.js、Java和Python作为后端编程/脚本语言,因此您绝对可以使用它来连接RDS。(链接
最后,这里是有关在连接到RDS时指定IAM角色的文档。(见下图):

enter image description here


好的。现在我正在尝试这样做。但是当我尝试在我的 Lambda 函数中包含 mysql 模块时,它会显示错误,例如:var mysql= require("mysql"); 它会显示错误,比如_"errorMessage": "无法找到模块'mysql'"_。 - ARUNBALAN NV
指向 IAM 角色以连接 RDS 是不正确的。Lambda 中的 RDS 连接不在 VPC 中。您需要将 RDS 设置为公共,并使用常规的 MySQL 凭据进行连接。 - adamkonrad
我只是指出了文档。这里绝对不需要负面评价。此外,原始帖子与VPC无关。 - Jordan
好的,谢谢。但是当我运行 Lambda 函数时,它无法连接到我的 RDS MySQL 数据库。我正在使用以下安全组规则:类型:MYSQL/Aurora,协议:TCP,端口范围:3306,来源:0.0.0.0/0 - ARUNBALAN NV

2
我只是想从我的Lambda函数更新数据库。通过指定IAM角色和访问策略可以访问RDS吗?
不可以。您需要提供DB的URL/用户名/密码才能连接。如果Lambda在私有子网中,则可能需要在同一VPC中运行Lambda。请参见下面的建议。
我可以使用mysql客户端连接到mysql数据库,但是当我尝试在Lambda上执行时,无法连接。
这严格禁止!除非您确实需要,否则不应从互联网访问您的RDS。尝试在私有子网中运行它,并相应地配置其他AWS服务。
如果Lambda访问资源超时,以下是我的两个建议:
默认情况下,Lambda 具有互联网访问权限,并且可以访问在线资源。
Lambda 无法访问您的 VPC 中私有子网中运行的服务。
要连接私有子网中的服务,您需要在私有子网中运行 Lambda。为此,您需要转到网络部分并配置您的 VPC、子网和安全组。
但是请注意,这样做会使您失去互联网访问权限。如果您仍然需要互联网访问权限,则需要在公共子网中启动 NAT 网关或 NAT 实例,并将路由从私有子网配置到该 NAT。
当我尝试从我的 Lambda 连接到私有子网中的 RDS 时,我遇到了这个问题。由于我使用 KMS 加密了一些环境变量,并且解密部分需要互联网访问权限,因此我不得不使用 NAT 网关。
更多细节 - http://docs.aws.amazon.com/lambda/latest/dg/vpc.html#vpc-internet 如何从 AWS Lambda 连接到 postgres RDS 注:上述链接指向我的个人博客,其中有更多相关信息。

我相信你的第一个答案已经不再完全正确了 - https://aws.amazon.com/premiumsupport/knowledge-center/users-connect-rds-iam/ - blahblah
这个答案已经过时了。 - Anjan Biswas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接