#amazon-web-services #docker #docker-compose #terraform #amazon-ecs
Вопрос:
В настоящее время я перехожу на AWS ECS после использования AWS Elastic Beanstalk с платформой Ruby для размещения и развертывания моего приложения Rails в течение последних 6 с лишним лет.
Таким образом, мне пришлось докеризировать свое приложение и другие службы с помощью docker-compose, и теперь я рассматриваю вопрос о том, как обеспечить инфраструктуру и подготовить развертывание кода.
Я потратил недели на изучение этой миграции, но сейчас я немного перегружен разнообразием методов развертывания инфраструктуры и приложений в AWS (второй пилот, докер-композиция, электронная почта с докером и т. Д.).
Кроме того, я надеялся оставаться как можно более независимым от облачной платформы, поскольку в будущем я перенесу часть своей инфраструктуры AWS в Цифровой океан. Поэтому я надеялся использовать Terraform, но поскольку все упомянутые выше варианты, похоже, используют CloudFormation внутри, Terraform кажется ненужным.
Учитывая этот контекст, какие процессы и инструменты я должен использовать, если я хочу:
- Обеспечьте мою инфраструктуру на AWS с помощью Terraform.
- Быстро и просто внедряйте изменения кода в производство без простоев. В идеале мы бы не использовали инструменты разработки на основе AWS (CodeCommit, CodeDeploy и т. Д.).
Я новичок в docker, и elastic beanstalk настолько упростил развертывание кода, что я не уверен, где еще мне следует искать. Я никогда раньше не использовал такие инструменты, как Дженкинс, и не совсем уверен, вписывается ли это в мои процессы.
Спасибо вам за руководство!
Ответ №1:
Непрерывная интеграция/непрерывное развертывание
Инструменты, основной обязанностью которых является CI/CD (например, CodePipeline, Дженкинс, CircleCI, действия на GitHub), являются частью головоломки, которая свяжет все остальное воедино. Это позволит вам четко определить последовательные шаги для вашего конвейера развертывания.
Для определения этих отдельных шагов сначала необходимо ответить на некоторые вопросы (не исчерпывающие!):
- Собираетесь ли вы создавать свой образ Docker один раз для каждой среды или только один раз в общей сложности?
- Вы создаете и публикуете свой образ Docker в реестре артефактов (например, Docker Hub или AWS ECR), прежде чем позже извлекать его на этапе развертывания?
- Вы хотите, чтобы каждый толчок/слияние в/в
main/master
запускал ваш конвейер или вы хотите вручную запустить некоторые/все из них? - Вам нужно использовать Docker Compose или будет достаточно Docker? Какие еще сервисы вы используете?
- Как вы создаете и запускаете свое приложение локально?
Реализация
Вероятный сценарий заключается в том, что вы в конечном итоге будете использовать Docker, Terraform и AWS CLI в какой-то контейнерной оболочке Linux для реального достижения своих целей. Большинство современных поставщиков услуг CI/CD-как-услуга позволяют вам выбирать изображение Docker для каждого этапа вашего конвейера(ов), поэтому вы должны иметь возможность выбрать изображение, которое уже отвечает вашим потребностям.
Разделение подготовки инфраструктуры и развертывания приложений
Это может быть сделано в рамках одного и того же проекта Git, но с использованием отдельных конвейеров/заданий/этапов (название зависит от выбранного вами поставщика CI/CD). В качестве альтернативы вы можете выбрать отдельное репо. Лично я нахожу, что, держа их вместе, легче синхронизировать события.
Вы также должны четко понимать, где заканчиваются обязанности Terraform. Хотя можно использовать Terraform для развертывания контейнера, я бы сказал, что он должен быть ограничен базовой инфраструктурой.
Оставаясь облачным агностиком
Выбор чего-то вроде действий на GitHub или CircleCI даст вам возможность развертывания в нескольких облаках (например) в будущем. Однако, если дело дойдет до выбора чего-то вроде CodeDeploy вместо написания множества сценариев оболочек, чтобы получить желаемое поведение развертывания, я вижу, что стоит понести будущие затраты на миграцию за время и усилия, сэкономленные в настоящее время.