错误:连接ETIMEDOUT rds lambda

use*_*327 12 amazon-rds node.js aws-lambda

我试图使用Lambda函数连接到RDS,但我收到一个错误:

var mysql = require('mysql');
exports.handler = function(event, context) {   
           //Connect to RDS

var connection = mysql.createConnection({
host     : 'hostname',
user     : 'username',
password : 'password',
database : 'database'

});

connection.connect( function(err)
{
   if (err)
   { 
     throw err;
   }
else 
  {
    console.log('DB connection establish');
  }
  });

 };
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

START RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae Version: $LATEST

2016-03-08T23:08:06.737Z    9711e650-e582-11e5-af5f-97ba391a42ae    
Error: connect ETIMEDOUT  
  at Connection._handleConnectTimeout (/var/task/node_modules/mysql/lib/Connection.js:412:13)       
      at Socket.g (events.js:180:16)   
    at Socket.emit (events.js:92:17)   
    at Socket._onTimeout (net.js:327:8)     
    at _makeTimerTimeout (timers.js:429:11)   
    at Timer.unrefTimeout [as ontimeout] (timers.js:493:5)    
    --------------------
    at Protocol._enqueue (/var/task/node_modules/mysql/lib/protocol   /Protocol.js:141:48)    
    at Protocol.handshake (/var/task/node_modules/mysql/lib/protocol    /Protocol.js:52:41)      
    at Connection.connect (/var/task/node_modules/mysql     /lib/Connection.js:123:18)     
    at exports.handler (/var/task/exports.js:21:12)     
END RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae        
REPORT RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae  
Duration: 10988.17ms    
Process exited before completing request
Run Code Online (Sandbox Code Playgroud)

ajm*_*rry 19

我有同样的问题,只是解决了它.看来这是stackoverflow上这个问题的最佳搜索结果,我将在这里发布我的解决方案.

此答案适用于VPC内的RDS实例

  1. 将Lambda函数放在与RDS实例相同的VPC中
  2. 你的lambda执行角色需要有VPC执行策略 AWSLambdaVPCAccessExecutionRole

  3. 将一个安全组分配给lambda函数

  4. 在附加到RDS实例的安全性中,为mysql/aurora(端口3306)添加入站规则,而不是为IP地址添加它为lambda函数安全组添加它.

总之,这将lambda放在与RDS相同的VPC中,并且无论lambda函数的IP如何,都为lambda函数提供对MYSQL的入站访问.


kop*_*aka 3

我遇到了同样的问题,并在谷歌搜索时找到了您的条目,但现在我解决了。遗憾的是,我不确定哪个操作真正解决了这个问题,但请检查:

  • 如果您不使用 VPC,请查看它是否可以与可公开访问的 RDS 配合使用,至少出于测试目的
  • 在身份和访问管理区域中授予您的角色(例如 lambda_basic_execution)AmazonRDSFullAccess
  • 在数据库实例的 RDS 概述中,您可以单击所选的安全组进行编辑:在以下窗口中,您可以指定入站和出站流量规则。在我的工作示例中,我允许双向来自所有端口和所有 IP (0.0.0.0/0) 的所有流量。当然,这不是一个安全的解决方案,但就您的示例而言,我想您(像我一样)刚刚进入 AWS 并尝试首先构建工作示例。您稍后可以随时编辑这些规则以逐渐限制流量。我这样做是为了测试我首先通过自己的计算机对 RDS 的访问

我无需在 lambda 函数中设置 VPC 选项或 API 端点即可使其工作,并通过以下方式建立连接

exports.handler = function(event, context) {
var mysql      = require('mysql');
var connection = mysql.createConnection({
host     : 'hostwithoutport',
user     : 'user',
password : 'password',
database : 'database'
});

connection.query('SELECT * FROM Xy WHERE ID = "1"', function(err, rows) {
if (err) {
console.error('error connecting: ' + err.stack);
context.fail();
return;
}

console.log('connected as id ' + connection.threadId);
context.succeed(rows);
});
};
Run Code Online (Sandbox Code Playgroud)

您也可以采用不同的方式,但请记住 lambda 函数始终成功和失败(或完成),最好在语句后的 if 子句内。否则,您可能会遇到问题,因为 lambda 函数在查询确定结果之前就成功,并且您无法获得正确的结果。如果您不以某种方式结束 lambda 函数,函数本身就会超时,但看起来会有所不同。

还要记住始终结束连接,这是通过直接使用查询来暗示的 - 此方法自行连接和结束。根据我在不同线程中读到的内容,理论上也可能由于您曾经调用的连接仍然打开而发生此问题。