2016-03-08 1 views
6

Я пытаюсь подключиться к RDS с помощью функции Lambda, но я получаю сообщение об ошибке:Ошибка подключения ETIMEDOUT 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'); 
    } 
    }); 

}; 

Ошибка я получаю это:

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 

ответ

2

я имел та же проблема и нашел вашу запись во время поиска в Интернете, но теперь я решил ее. К сожалению, я не уверен, что, конечно, действие на самом деле решить ее, но проверить:

  • Если вы не сделаете использование VPCs увидеть, если он работает с общедоступным RDS, по крайней мере, для целей тестирования
  • Grant ваша роль (например, lambda_basic_execution) AmazonRDSFullAccess в области управления идентификацией и доступом
  • В RDS Обзор вашего экземпляра базы данных вы можете щелкнуть по выбранным группам безопасности для их редактирования: в следующем окне вы можете указать входящие и правил исходящего трафика. В моем рабочем примере я разрешил весь трафик со всех портов и всех IP-адресов (0.0.0.0/0) в обоих направлениях. Конечно, это не безопасное решение, но в отношении вашего примера я предполагаю, что вы - как и я - просто входите в AWS и сначала пытаетесь создать рабочие примеры. Вы можете всегда редактировать эти правила позже, чтобы постепенно ограничивать трафик. Я сделал это, чтобы проверить мой доступ к RDS с помощью собственного компьютера, на первый

Я сделал это работать без установки опций 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); 
}); 
}; 

You также может делать это по-другому, но имейте в виду, чтобы всегда преуспеть и не удалось (или сделала) лямбда-функцию, предпочтительно в условии if после заявления. В противном случае у вас могут возникнуть проблемы из-за функции лямбда, которая будет выполняться до того, как запрос сможет определить результаты, и вы не получите правильный результат. Если вы не закончите функцию лямбда в некотором роде, функция сама выберет время, которое, однако, будет выглядеть по-другому.

Также помните, что всегда заканчивайте соединения, это подразумевается непосредственно с помощью запроса - этот метод соединяется и кончается сам по себе. Согласно тому, что я читал в другом потоке, эта проблема теоретически может возникнуть из-за еще открытого соединения, которое вы когда-то вызывали.

11

У меня была такая же проблема, как и у меня, и она была исправлена. Учитывая, что это самый лучший результат поиска этой проблемы в stackoverflow, я собираюсь опубликовать мое решение здесь.

Этот ответ для экземпляра RDS внутри VPC

  1. место функция Lambda в том же VPC, как экземпляр RDS
  2. ваше исполнение лямбда роль вам нужно будет иметь исполнение VPC добавил к нему в IAM
  3. назначить группу безопасности для лямбда-функции
  4. в безопасности, прикрепленной к примеру RDS, добавить правило входящего трафика для MySQL/сияний (порт 3306) и вместо того, чтобы добавить его для IP-адреса добавьте его для лямбды функции группы безопасности.

Таким образом, это помещает лямбда в тот же VPC, что и RDS, и дает входящий доступ лямбда-функции к MYSQL независимо от IP-функции лямбда-функции.

+0

Это решило проблему с тайм-аутом для меня. Благодаря! – SexxLuthor

 Смежные вопросы

  • Нет связанных вопросов^_^