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

时间:2017-05-16 17:36:51

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

我正在尝试将AWS Lambda函数连接到RDS中的数据库,我跟踪了一些帖子,这些帖子表明他们都需要在同一个VPC中,但是亚马逊支持已经告诉他们情况并非如此。 虽然我已经尝试了一个带有nat网关和安全组的多子网VPC,允许访问每个,但没有优势。

我可以毫无问题地与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;
  }

1 个答案:

答案 0 :(得分:0)

有两个问题。

1 VPC设置

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

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

  • Lambda执行角色需要能够创建,描述和删除网络接口。
  • Lambda函数和RDS实例需要位于同一个VPC中。
  • Lambda函数和RDS实例需要位于相同的子网中。
  • Lambda函数和RDS实例需要共享一个安全组。
  • 该安全组需要有一条规则允许来自同一安全组中其他实体的流量。
  • 子网需要有备用地址空间,以允许lambda创建弹性网络接口。

    源Amazon Web服务支持

<强> 2。 Node.js回调

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

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