#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 с моими сетевыми группами / группами безопасности, но я чувствую, что перепробовал все:
- Убедитесь, что база данных настроена на общедоступную
- Создал новую группу безопасности и добавил ее в EC2 и в RDS
- Полностью открыты порты (входящие и исходящие)
- Создан VPC и добавлен как в EC2, так и в RDS
- Проверено, что входящие / исходящие сообщения открыты в подсети NACL VPC
Любая помощь была бы высоко оценена. Я схожу с ума
Комментарии:
1. В зависимости от пула, ваш серверный сервер работает в частных или общедоступных подсетях?
2. @Marcin Извиняется, я новичок в AWS и не уверен. Как мне это проверить? Чтобы развернуть приложение, я загружаю свой интерфейс и серверную часть на свой github, переношу все это на экземпляр ec2 и запускаю его с помощью npm start, как я бы делал локально
Ответ №1:
Подключитесь к своему серверу и попробуйте отладить соединение с помощью telnet или клиента PostgreSQL.
Наиболее распространенными ошибками при этой ошибке являются:
- Группа безопасности RDS не разрешает входящие подключения из вашего диапазона VPC или для общедоступного IP-адреса сервера EC2 (в случае общедоступной базы данных).
- Подсеть RDS не разрешает исходящие соединения в NACL. Имейте в виду, что только первое соединение происходит в порту, который вы определяете в RDS, остальные соединения происходят на других портах; но я думаю, что это не ваш случай, раз вы сказали, что можете подключиться локально.
- Таблица маршрутов RDS не разрешает подключения извне VPC. Но, опять же, я думаю, что это не ваш случай.
- Группа безопасности EC2 не разрешает исходящие подключения к RDS. Этот случай немного сложнее, но это может произойти, если вы неправильно настроили SG.
- Последний случай заключается в том, что подсети вашего сервера 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.