在 RDS 中访问 MySQL 或 MS SQL 时的 AWS Lambda node.js ETIMEDOUT

Posted

技术标签:

【中文标题】在 RDS 中访问 MySQL 或 MS SQL 时的 AWS Lambda node.js ETIMEDOUT【英文标题】:AWS Lambda node.js ETIMEDOUT when accessing MySQL or MS SQL in RDS 【发布时间】:2017-10-15 22:15:28 【问题描述】:

我正在尝试将 AWS Lambda 函数连接到 RDS 中的数据库,我关注了一些帖子,这些帖子建议它们都需要位于同一个 VPC 中,但亚马逊支持人员告诉我情况并非如此. 尽管我已经尝试了一个多子网 VPC,它带有 nat 网关和允许访问每个安全组的安全组,但没有占上风。

我可以毫无问题地与 SQL 管理工作室或 mysql 工作台中的数据库实例交谈。

10:13:00 2017-05-16T10:13:00.509Z 回调 connection.connect() 10:13:00 2017-05-16T10:13:00.547Z 错误 ETIMEDOUT

我现在尝试了几种不同的连接方法,我使用了帖子中的示例,唯一的区别是这个数据库不在 RDS 中。

Querying a MySQL database from a NodeJS AWS Lambda Function

我尝试了 MSSQL 和 MSSQL 数据库实例,都遇到了连接超时。我已将所有相关政策附加到 lambda 函数中。

我在下面包含了一个简单的测试,只是为了尝试建立连接。

在下面添加了测试代码,而不是在 Alexa 调用的底部。

function mysqltest2() 
    var mysql      = require('mysql');
    var connection = mysql.createConnection(
      host     : 'endpoint.rds.amazonaws.com',
      user     : 'user',
      password : 'pass',
      database : 'db'
      );
                  var test;
                  console.log(`Intent Request`);
                  console.log('Then run MySQL code:');
                  connection.connect(function(err) 
                      console.log('Inside connection.connect() callback');
                      if (!err) 
                          console.log("Database is connected ... ");
                          connection.query("SELECT 1 + 1 AS solution",
                              function(err, result) 
                                  console.log("Inside connection.query() callback")
                                  if (!err) 
                                      console.log(result);
                                      console.log("Query Successful! Ending Connection.");
                                      test = result;
                                      connection.end();
                             else 
                                      console.log("Query error!");
                                  
                              );
                       else 
                          console.log("Error connecting database ..." +             err.message);
                      
                  );
                  return test;
  

【问题讨论】:

他们没有必须在同一个 VPC 中,但这是最直接、最安全和最具成本效益的配置。无论如何,这并不难做到,所以一定有你忽略的东西或你正在做出的错误假设。因此,请告诉我们您想要如何操作,我们可以从那里进行故障排除。您也可以解释一下您与 AWS 支持人员交谈但没有有效解决方案的原因。 提供 lambda 函数以便我们为您提供帮助。 您的 lambda 的 vpc 子网的路由表是否有路由将 0.0.0.0/0 流量发送到 nat 网关?你能从你的 lambda 访问互联网吗?您可以尝试访问一个简单的网页来确认这一点。 @Michael-sqlbot 我确定这很简单,但有些东西我遗漏或不理解。 AWS 支持来自另一个帐户,涉及不同的问题。理想情况下,我需要 RDS 中的 MSSQL 数据库,我可以从 node.js Lambda 函数中查询该数据库,该函数也可以访问互联网。 @Binary101010 添加到主要问题中。 【参考方案1】:

有两个问题。

1 VPC 设置

VPC 设置,阅读 @Michael - 关于 VPC 的 sqlbot 帖子帮助很大。

在 VPC 中使用 lambda 时,需要考虑以下因素。

Lambda 执行角色需要能够创建、描述和删除网络接口。 Lambda 函数和 RDS 实例需要在同一个 VPC 中。 Lambda 函数和 RDS 实例需要位于同一子网中。 Lambda 函数和 RDS 实例需要共享一个安全组。 该安全组需要具有允许来自同一安全组中其他实体的流量的规则。

子网需要有备用地址空间,以允许 lambda 创建弹性网络接口。

来源亚马逊网络服务支持

2。 Node.js 回调

第二个基本上是node.js中的回调地狱

由于从 Alexa 意图调用该函数,它在回调触发之前执行 content.success。这会导致下次代码执行时超时,因为它仍在忙于执行上一个命令。我通过将所有回调嵌套并在回调中生成 SpeechletResponse 来解决这个问题。

【讨论】:

以上是关于在 RDS 中访问 MySQL 或 MS SQL 时的 AWS Lambda node.js ETIMEDOUT的主要内容,如果未能解决你的问题,请参考以下文章

如何将 AWS ELB 连接到运行 MS SQL 的 RDS?

如何允许ECS任务访问RDS

Flink SQL 在执行 Select 时内存不足 - 从 RDS 插入到 Mysql

在 .NET 或 MS SQL 中模拟 MySql OLD_PASSWORD?

如何将数据从 Ms 访问迁移到 Derby 数据库或如何将数据从 My sql 迁移到 Derby 数据库

通过 MYSQL 工作台连接到 RDS 实例,无需静态 IP