Приложение Elastic Beanstalk не подключается к экземпляру RDS MySQL

У меня есть установка PHP-приложения CodeIgniter на экземпляре Elastic Beanstalk. Я пытаюсь подключить его к экземпляру RDS MySQL, который я настраиваю, но загрузка URL-адреса сайта Elastic Beanstalk всегда приводит к тому, что страница прерывает соединение. Я сузил проблему до невозможности подключиться к базе данных.

Я думаю, что я правильно настроил свои группы безопасности, чтобы экземпляры Elastic Beanstalk EC2 могли взаимодействовать с RDS, но что-то должно быть не так, поскольку страница все еще не загружается.

Я включил ниже снимки экрана с правилами входящего / исходящего трафика для группы безопасности, которую используют RDS и Elastic Beanstalk, а также снимок экрана с тем, какие группы безопасности я подключил к экземпляру Elastic Beanstalk.

Правила для входящих

Исходящие правила

введите описание изображения здесь

Есть идеи, почему мое приложение Elastic Beanstalk не может взаимодействовать с моим экземпляром RDS?


РЕДАКТИРОВАТЬ: экземпляр RDS и экземпляр Elastic Beanstalk находятся в одной группе безопасности.


person Tim Jahn    schedule 18.10.2015    source источник
comment
На вашем скриншоте указаны sg-e9f3918d и sg-69315d0d. Но вы не показываете правила для sg-69315d0d. Вы настроили среду beanstalk и RDS для использования одной и той же группы безопасности sg-e9f3918d? Что произойдет, если вы подключитесь к узлу по SSH и попытаетесь подключиться к вашей конечной точке RDS через telnet через порт 3306?   -  person mickzer    schedule 19.10.2015
comment
Да, и экземпляр Elastic Beanstalk, и экземпляр RDS находятся в одной группе безопасности sg-e9f3918d.   -  person Tim Jahn    schedule 19.10.2015


Ответы (5)


Добавьте имя группы безопасности стека, с которой настроен ваш Elastic Beanstalk, в список групп безопасности RDS.

Проще всего проверить, войдя в экземпляр EC2 (например, eb ssh) и протестировав соединение с базой данных, чтобы исключить какие-либо проблемы с вашим приложением.

mysql -u user -p password -h rds.instance.endpoint.region.rds.amazonaws.com
person Gustaf    schedule 19.10.2015
comment
Экземпляр Elastic Beanstalk и экземпляр RDS находятся в одной группе безопасности. - person Tim Jahn; 19.10.2015
comment
Можно ли подключиться к базе данных из экземпляра EC2 вручную, как я показал? - person Gustaf; 20.10.2015
comment
Да, мне удалось подключиться к экземпляру RDS, когда я подключился к экземпляру Elastic Beanstalk по ssh. Тогда не уверен, что случилось. - person Tim Jahn; 21.10.2015
comment
@TimJahn, так вам удалось решить проблему? .. Вы отметили вопрос как решенный, не могли бы вы поделиться своим решением? - person DataGreed; 21.01.2020

Теперь существует руководство о том, как подключить ElasticBeanstalk к любая база данных RDS (MySQL и т. д.) таким образом, чтобы не связывать их вместе, т. е. вы можете создавать их по отдельности. В этом руководстве описывается настройка групп безопасности через консоль AWS.

После этого вам необходимо установить 5 переменных среды ElasticBeanstalk (по крайней мере, для MySQL): RDS_HOSTNAME, RDS_PORT, RDS_DB_NAME, RDS_USERNAME & RDS_PASSWORD.

Различные экземпляры ElasticBeanstalk будут обращаться к этим переменным по-разному, чтобы установить соединение с базой данных (я знаю, что в PHP вы должны использовать $_SERVER['RDS_DB_NAME'] и т. Д.). Посмотрите, как это сделать на Java, Node.js, Python, Ruby и .NET, по ссылке выше.

person Abhishek Divekar    schedule 30.12.2016
comment
Ой, это меня спасло. Спасибо. Предлагается использовать диспетчер секретов для информации о базе данных, а затем использовать переменные среды для определения секрета, который вам нужно прочитать. Но .. спасибо, спасибо, спасибо. - person ticktock; 09.03.2019
comment
@ticktock, добро пожаловать :) Если бы вы могли внести свой вклад в ответ с дополнительной информацией о секретах, которые вы упоминаете, было бы даже лучше! - person Abhishek Divekar; 09.03.2019

Вы также запускали экземпляр RDS в VPC?

Вашей группе безопасности RDS необходимо предоставить входящий трафик на порт 3306 группе безопасности beanstalk.

например, группа безопасности RDS

Incoming
ALLOW TCP 3306 from BeanstalkSG

Не открывать до 0.0.0.0

Поскольку вы уже разрешаете весь исходящий трафик, вашему Beanstalk SG не нужно дополнительно предоставлять 3306 для исходящего трафика.

Допускают ли ваши ACL VPC трафик на 3306? (По умолчанию они это делают)

person Michel Feldheim    schedule 19.10.2015
comment
Я добавил это входящее правило, и проблема все еще сохраняется (мои новые правила: imgur.com/DLjij33). ACL VPC в настоящее время разрешают трафик на всех портах. - person Tim Jahn; 19.10.2015

Новые пользователи часто путают имя экземпляра RDS с именем базы данных.

Имя экземпляра - это просто ярлык, который вы и другие люди используете для организации ваших элементов RDS. Этот ярлык вообще не используется в вашем приложении.

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

После создания экземпляра / кластера RDS помните, что ваш сервер ПУСТО. В нем нет базы данных.

У вас может быть много баз данных внутри экземпляра или кластера RDS, точно так же, как у вас может быть много баз данных внутри сервера MySQL. И по умолчанию у вас их нет.

Перед использованием RDS в приложении необходимо выполнить команду «CREATE DATABASE» в командной строке MySQL.

Честно говоря, на вашем только что созданном экземпляре RDS есть одна база данных. Он называется «mysql», но вам не разрешено использовать его в своих приложениях.

Единственный способ создать базу данных для использования в вашем приложении - использовать экземпляр EC2, поскольку экземпляры RDS не являются общедоступными.

Простые шаги:

1. Создайте нано-экземпляр (в той же группе VPC / безопасности);

2. Подключитесь к экземпляру nano через SSH (например, ssh -i <my_key.pem> my_nano.amazonaws.com);

3 mysql -u <master_user> -p -h <rds_endpoint>

4. master_user и master_password - это те, которые вы установили при создании кластера RDS - для этих учетных данных нет значения по умолчанию;

5. В mysql создайте базу данных: CREATE database <my_db>;

6. Затем в своем приложении используйте: master_user, master_password, my_db, rds_endpoint.

person Daniel Loureiro    schedule 25.09.2018
comment
Как создать базу данных из консоли aws? - person Álvaro Agüero; 03.04.2019

Шаг 1. Убедитесь, что экземпляр БД RDS находится в состоянии "доступен".

Посетите базу данных RDS в Консоли AWS >> «Сводка» >> Информация:

введите здесь описание изображения

Шаг 2. Убедитесь, что ваш экземпляр EC2 может подключиться к экземпляру RDS:

  • войдите в свой экземпляр EC2 и выполните любую из следующих команд:

    • telnet <RDS endpoint> <port number>
    • nc [-vz] <RDS endpoint> <port number>

      • If either the telnet or nc commands succeed, then a network connection was established, and the issue is likely caused by the user authentication to the database, such as user name and password.
      • Если ни одна из вышеперечисленных команд не удалась, убедитесь, что входящие правила вашего экземпляра RDS настроены так, чтобы разрешать подключения из группы безопасности вашего экземпляра EC2.

Шаг 3. Убедитесь, что вы передаете правильные параметры подключения:

  • Хост сервера БД: перейдите в базу данных RDS в консоли AWS >> «Подключение и безопасность» >> Конечная точка.
  • Порт БД: посетите базу данных RDS в консоли AWS >> "Подключение и безопасность" >> Порт.
  • Имя пользователя БД: перейдите в базу данных RDS в Консоли AWS >> «Конфигурация» >> «Главное имя пользователя».
  • Пароль БД: как вы упомянули при создании экземпляра RDS.
  • Имя БД: Посетите базу данных RDS в Консоли AWS >> "Конфигурация" >> "Имя БД"

    mysql -u user -p password -h <RDS endpoint>

Шаг 4. Убедитесь, что формат URL вашей строки подключения правильный:

Для подключения к экземпляру Mysql RDS из приложения Spring формат URL-адреса будет следующим:

spring.datasource.url=jdbc:mysql://<RDS endpoint>:3306/ebdb?createDatabaseIfNotExist=true
person Yatendra    schedule 04.05.2020