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

22

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

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

У вас нет базы данных.  Вы можете создать новую базу данных RDS или использовать существующую базу данных.

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

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

Вениамин
источник

Ответы:

24

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

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

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

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

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

rgareth
источник
год спустя и все еще кажется, что это так?
lifeofguenter
1
Все еще так, насколько я знаю.
rgareth
Как мы столкнемся с этим AWS?
Матфея
год спустя, это все то же самое.
Каран Кумар
Шаги для добавления rds docs.aws.amazon.com/elasticbeanstalk/latest/dg/… (только для полноты для таких людей, как я, ищущих его). Они не создают конфигурацию среды и загружают ее через файл конфигурации при создании. Это должно добавить env vars, так что, пока они не меняются, это должно быть хорошо?
Мануэль
18

Ответ от службы поддержки AWS :

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

Если вы хотите, чтобы экземпляр RDS существовал вне среды, вы можете просто предоставить параметры соединения в качестве переменных среды через консоль EB: Конфигурация -> Веб-уровень -> Конфигурация программного обеспечения. Затем вы можете прочитать переменную окружения через PHP .

Вениамин
источник
Я выбрал второй подход, определяя переменные среды с именами RDS_ * в соответствии с соглашением. Группы безопасности установлены довольно жестко, но все еще кажется немного свободным помещать пароль БД в переменную окружения.
Джозеф Шиди
@velotron То же самое для меня, но я привык к этому!
Бенджамин
2

Недавно мне это понадобилось, а также я хотел автоматизировать шаги с помощью интерфейса командной строки AWS CLI / EB. В любом случае, вот основные шаги, которые я выполнил (при условии, что вы уже создали экземпляр 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 (не группы безопасности DB). Вероятно, вы можете добиться того же с группами безопасности БД, если они поддерживаются в вашем регионе. При настройке правила входящего трафика убедитесь, что вы используете правильный протокол и порт для своей базы данных.
  7. Добавьте группу эластичного распределения нагрузки в группы безопасности вашего экземпляра RDS (снова с помощью aws rds modify-db-instance(AWS CLI)).
  8. Перезагрузите или повторно разверните приложение Elastic Beanstalk (например, с помощью eb deploy(EB CLI)). Мне пришлось сделать повторное развертывание, так как я запускаю миграции на развертываниях.

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

Торстен
источник
0

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

Например:

$ cat .ebextensions/securitygroup-addexisting.config
option_settings:
  - namespace: aws:autoscaling:launchconfiguration
    option_name: SecurityGroups
    value: rds-launch-wizard-1
PBA
источник
0

Я столкнулся с той же проблемой и исправил с помощью следующих шагов:

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

2) Перейти в группу безопасности RDS ad = nd входящий трафик

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

Надеюсь, это будет полезно

Ваквар хан
источник
-2

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

Максимум
источник