Назад | Перейти на главную страницу

Как связать существующий экземпляр RDS со средой Elastic Beanstalk?

Я создал свой экземпляр RDS до создания среды Elastic Beanstalk. Эти двое работают вместе без проблем, но я бы хотел, чтобы они были связаны вместе и чтобы параметры RDS были доступны через RDS_* переменные среды.

На странице конфигурации Elastic Beanstalk говорится:

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

Как я могу связать существующий экземпляр RDS с моей средой Elastic Beanstalk?

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

Первый вопрос: Почему вы хотите, чтобы экземпляр RDS существовал вне среды EB? Ответ: Чтобы время жизни экземпляра RDS не было привязано к времени жизни среды EB. т.е. когда вы удаляете среду, вы не хотите уничтожать ею БД. Есть очень мало причин, по которым вы действительно хотите привязать свой экземпляр RDS к своей среде.

Проблема с настройкой RDS независимо от EB заключается в том, что вы не получаете автоматическое заполнение переменных RDS_ * и, следовательно, вам нужно получать их значения и заполнять их самостоятельно через веб-консоль или .ebextensions. Однако не рекомендуется добавлять учетные данные в код, так как это может быть дырой в безопасности.

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

Идеальным решением является усовершенствование EB, так что ссылка «использовать существующую базу данных», упомянутая в вопросе, фактически позволяет вам вручную связать существующую базу данных RDS, а затем автоматически заполнить переменные среды RDS_ *, а не перенаправлять вас к бесполезной документации . AWS Support заявила, что это было подано как запрос функции, но, конечно, не указаны сроки.

Ответ от Поддержка AWS:

Чтобы связать существующую базу данных со средой EB, вы должны сделать ее снимок через консоль управления, а затем выбрать «создать новую базу данных RDS» на уровне данных. Похоже, что нет способа связать работающий экземпляр RDS с существующей средой EB без запуска нового из моментального снимка из-за того, как экземпляр RDS привязан к базовому стеку Cloudformation среды Beanstalk. Если вы сделаете снимок текущего экземпляра RDS, вы можете запустить его заново в EB, если хотите.

Если вы хотите, чтобы экземпляр RDS существовал вне среды, вы можете просто указать параметры подключения как переменные среды через консоль EB: Configuration -> Web Layer -> Software Configuration. Тогда ты можешь прочитать переменную окружения через PHP.

Мне это было нужно недавно, и я также хотел автоматизировать шаги с помощью AWS CLI / EB CLI. В любом случае, вот основные шаги, которые я выполнил (при условии, что вы уже создали экземпляр RDS):

  1. Убедитесь, что для вашего экземпляра RDS настроена другая группа безопасности (а не группа VPC по умолчанию). Ты можешь использовать aws ec2 create-security-group (AWS CLI) для этого и свяжите его с экземпляром RDS, используя aws rds modify-db-instance (AWS CLI).
  2. Инициализируйте приложение beanstalk (я использовал eb init (EB CLI) для этого).
  3. Прочтите соответствующие данные конфигурации из базы данных RDS (имя БД, имя хоста, порт и т. Д.). я использовал aws rds describe-db-instances для этого.
  4. Используя эти данные, установите RDS_* переменные среды в экземпляре EB при создании среды (или развертывании среды позже). Вы можете сделать это с помощью eb create/eb deploy (EB CLI). При первоначальном создании среды она будет ухудшена, поскольку группы безопасности для доступа к базе данных RDS не настроены должным образом.
  5. Получите соответствующие группы безопасности из конфигурации EB. Вам понадобится один для группы автомасштабирования и для эластичного балансировщика нагрузки. Ты можешь использовать aws elasticbeanstalk describe-configuration-settings (AWS CLI) для этого.
  6. Авторизуйте свою группу автомасштабирования для входящего трафика в вашу базу данных для группы безопасности, которую вы настроили на шаге 1. Я использовал aws ec2 authorize-security-group-ingress (AWS CLI), который использует группы безопасности VPC (а не группы безопасности БД). Вероятно, вы сможете добиться того же с группами безопасности БД, если они поддерживаются в вашем регионе. При настройке правила входящего трафика убедитесь, что вы используете правильный протокол и порт для ядра базы данных.
  7. Добавьте группу эластичного балансировщика нагрузки в группы безопасности вашего экземпляра RDS (снова используя aws rds modify-db-instance (AWS CLI)).
  8. Перезагрузите или повторно разверните приложение Elastic Beanstalk (например, используя eb deploy (EB CLI)). Мне пришлось выполнить повторное развертывание, поскольку я запускаю миграции при развертывании.

Это в основном это. Теперь у вас должна быть возможность увеличивать / уменьшать свои экземпляры RDS, не заботясь об экземплярах EB, если вы сохраняете одинаковое имя хоста и учетные данные БД. Вы также можете выполнять сине-зеленые развертывания с этим подходом (но вам может потребоваться выполнить некоторые дополнительные шаги, чтобы также отменить доступ к группе безопасности).

Самый простой способ добавить существующую группу безопасности в экземпляры EB EC2 с помощью конфигурации - использовать простой файл, описанный в https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/security-configuration/securitygroup-addexisting.config

Например:

$ cat .ebextensions/securitygroup-addexisting.config
option_settings:
  - namespace: aws:autoscaling:launchconfiguration
    option_name: SecurityGroups
    value: rds-launch-wizard-1

Я столкнулся с той же проблемой и исправил, выполнив следующие действия:

1) Перейдите в экземпляр EC2 и обратите внимание на свой пример группы безопасности «sg-121212121212».

2) GO to RDS Security Group ad = nd входящий трафик

3) Отредактируйте правило, выберите весь трафик и добавьте новую группу безопасности ebs "sg-121212121212"

Надеюсь, это поможет

создать RDS под Elastic; добавит новую правильную группу безопасности; изменить группу безопасности старой существующей RDS; установите правильную строку подключения в веб-конфигурации, и все будет работать ...