Ошибка: подключите ETIMEDOUT rds lambda

Я пытаюсь подключиться к RDS с помощью функции Lambda, но получаю сообщение об ошибке:

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

person user1042327    schedule 08.03.2016    source источник
comment
для меня функция обработчика lamda была асинхронной. Я только что удалил ключевое слово async, теперь я могу выполнять операции CRUD в своей БД (RDS)   -  person vikas kv    schedule 29.10.2019


Ответы (4)


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

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

  1. поместите функцию Lambda в тот же VPC, что и ваш экземпляр RDS
  2. ваша роль выполнения лямбда-выражения вам понадобится политика выполнения VPC AWSLambdaVPCAccessExecutionRole

  3. назначить группу безопасности лямбда-функции

  4. В безопасности, прикрепленной к экземпляру RDS, добавьте правило для входящего трафика для mysql / aurora (порт 3306) и вместо добавления его для IP-адреса добавьте его для своей группы безопасности лямбда-функций.

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

person ajmcgarry    schedule 16.02.2017

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

  • Если вы не используете VPC, посмотрите, работает ли он с общедоступным RDS, по крайней мере, в целях тестирования.
  • Предоставьте свою роль (например, 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);
});
};

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

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

person kopaka    schedule 22.03.2016

Я хотел бы дополнить ответ ajmcgarry, поскольку мне потребовалась дополнительная работа, чтобы найти то, что мне нужно для решения этой проблемы:

  1. Да, вам нужно создать специальную роль для Lambda для доступа и управления VPC, следуйте инструкциям на этой странице: https://docs.aws.amazon.com/lambda/latest/dg/vpc-rds-create-iam-role.html
  2. Как только эта новая роль будет назначена вашей Lambda, вам нужно будет использовать тот же VPC, в котором запущен ваш экземпляр RDS.
  3. Вам необходимо использовать ту же группу безопасности в вашей лямбда-функции. Во-первых, в вашем экземпляре RDS найдите группу безопасности, измените ее и добавьте правила для входящих подключений для доступа к порту БД отовсюду в целях тестирования.
  4. Назначьте группу безопасности, которую вы только что изменили, своей лямбда-функции.

Вам нужны наглядные инструкции? Это видео не слишком длинное, и даже если оно для Python, инструкции применимы к этому случаю: https://www.youtube.com/watch?v=-CoL5oN1RzQ

person Sergio D.    schedule 20.06.2018

Для меня это была просто роль безопасности RDS, которая ограничивала входящее соединение с моим IP-адресом, поэтому, естественно, я мог подключиться с моей локальной машины, но моя лямбда-функция не могла, как только я открыл ее для публики (как писал Шервин , это не идеально, но работает для тестирования и игры) и повторно развернул мою лямбда-функцию (да, мне пришлось повторно развернуть тот же код, не знаю, как это повлияло на это), моя лямбда-функция смогла подключиться.

Мне не нужно было включать лямбду в тот же VPC, потому что моя база данных общедоступна.

Мне не нужно изменять или добавлять какие-либо роли безопасности в лямбда-выражение.

person Naguib Ihab    schedule 21.06.2018