Тайм-аут подключения к пулу — подключение к AWS RDS из EC2

#node.js #postgresql #amazon-web-services #amazon-ec2 #amazon-rds

#node.js #postgresql #amazon-веб-сервисы #amazon-ec2 #амазонка-rds #amazon-rds

Вопрос:

Я пытаюсь подключиться к экземпляру Amazon RDS (Postgres) с сервера EC2 через приложение NodeJS, используя пакет pg npm. Ошибка, с которой я получаю сообщение об ошибке (обратите внимание, что я подключаюсь к серверной части моего узла через приложение react): ПАРАМЕТРЫ / пользователи / вход 200 0,424 мс — 2
Ошибка при выборке клиента из пула Ошибка: Соединение прервано из-за тайм-аута соединения

Я протестировал приложение локально, и все работает отлично (включая подключение к RDS), но как только я запускаю приложение на сервере, я не могу подключиться.

Чтобы упростить проблему, я только что явно ввел свои учетные данные в файл маршрута NodeJS, чтобы я знал, что нет проблем с переменными среды и т.д. Затем я отправил свой код на сервер, извлек его как есть и запустил. Не повезло. С точки зрения подключения я просто создаю пул (требуется пул из pg), а затем использую pool.connect и client.запрос для отправки запроса.

Я чувствую, что, учитывая, что это работает локально, проблема связана с AWS с моими сетевыми группами / группами безопасности, но я чувствую, что перепробовал все:

  1. Убедитесь, что база данных настроена на общедоступную
  2. Создал новую группу безопасности и добавил ее в EC2 и в RDS
  3. Полностью открыты порты (входящие и исходящие)
  4. Создан VPC и добавлен как в EC2, так и в RDS
  5. Проверено, что входящие / исходящие сообщения открыты в подсети NACL VPC

Любая помощь была бы высоко оценена. Я схожу с ума

Комментарии:

1. В зависимости от пула, ваш серверный сервер работает в частных или общедоступных подсетях?

2. @Marcin Извиняется, я новичок в AWS и не уверен. Как мне это проверить? Чтобы развернуть приложение, я загружаю свой интерфейс и серверную часть на свой github, переношу все это на экземпляр ec2 и запускаю его с помощью npm start, как я бы делал локально

Ответ №1:

Подключитесь к своему серверу и попробуйте отладить соединение с помощью telnet или клиента PostgreSQL.

Наиболее распространенными ошибками при этой ошибке являются:

  1. Группа безопасности RDS не разрешает входящие подключения из вашего диапазона VPC или для общедоступного IP-адреса сервера EC2 (в случае общедоступной базы данных).
  2. Подсеть RDS не разрешает исходящие соединения в NACL. Имейте в виду, что только первое соединение происходит в порту, который вы определяете в RDS, остальные соединения происходят на других портах; но я думаю, что это не ваш случай, раз вы сказали, что можете подключиться локально.
  3. Таблица маршрутов RDS не разрешает подключения извне VPC. Но, опять же, я думаю, что это не ваш случай.
  4. Группа безопасности EC2 не разрешает исходящие подключения к RDS. Этот случай немного сложнее, но это может произойти, если вы неправильно настроили SG.
  5. Последний случай заключается в том, что подсети вашего сервера EC2 не разрешают подключения к Интернету. Вы сказали, что можете подключаться локально, поэтому я полагаю, что ваш RDS правильно настроен для разрешения общедоступных подключений; однако может случиться так, что вы не подключили интернет-шлюз или шлюз NAT в таблице маршрутов вашего сервера EC2 или неправильно настроили NACL для разрешения входящих / исходящих подключений из Интернета.

Комментарии:

1. Спасибо @Raul Запуск telnet <путь к хосту rds> <порт> с сервера возвращает: Подключенный к <путь к хосту ec2> Escape-символ ‘^]’. Странно ли, что он возвращает путь EC2, а не путь RDS? Обращаясь к другим элементам: 1. Одна и та же группа безопасности применяется к EC2 и RDS, и я открыл все диапазоны портов 2. У меня есть правило № 100 со всеми разрешенными протоколами / диапазонами. Есть еще одно правило, называемое *, которое ЗАПРЕЩАЕТ? не уверены, что это значит? 3. Согласитесь, я думаю, что это нормально 4. Та же группа безопасности, что и RDS, все порты открыты 5. Таблица маршрутов подсети EC2 имеет назначение: <мой общедоступный ip>, цель: локальная

2. Да, это странно; он должен показывать путь к хосту rds. Проверьте IP-адреса вашего хоста rds с помощью команды dig или nslookup.