【问题标题】:AWS Lambda node.js ETIMEDOUT when accessing MySQL or MS SQL in RDS在 RDS 中访问 MySQL 或 MS SQL 时的 AWS Lambda node.js ETIMEDOUT
【发布时间】: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 添加到主要问题中。

标签: mysql node.js amazon-web-services lambda amazon-rds


【解决方案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 来解决这个问题。

【讨论】:

    猜你喜欢
    • 2016-04-22
    • 2020-01-17
    • 2019-09-18
    • 1970-01-01
    • 2021-07-03
    • 2019-07-28
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多