Поиск по сайту:

Автоматизируйте обновления кода EC2 с помощью AWS CodeDeploy


CodeDeploy — это часть автоматизированного конвейера CI/CD AWS под названием CodePipeline. CodeDeploy обрабатывает часть развертывания конвейера, получая последние обновления кода на ваш парк серверов, не требуя их обновления вручную.

Как работает CodeDeploy?

CodeDeploy поддерживает автоматическое развертывание в EC2, Lambda и ECS. Для каждого типа приложения вы создаете «группу развертывания», которая сообщает CodeBuild, какие серверы обновлять и как. CodeDeploy может обновлять серверы по одному, подключаясь к балансировщику нагрузки и автоматически перенаправляя трафик с обновляемых серверов. Вы также можете запустить совершенно новые серверы, чтобы полностью минимизировать время простоя.

Вы также можете использовать его для ручного развертывания нового кода, но он гораздо полезнее в сочетании с CodePipeline, который автоматизирует процесс. Каждый раз, когда новые коммиты отправляются в выбранную ветку релиза в CodeCommit, Github или BitBucket, CodePipeline отправляет их в CodeBuild для автоматического тестирования и сборки. Если сборка выполнена успешно, готовая сборка отправляется в CodeDeploy, который обрабатывает процесс развертывания.

Фактическое обновление обрабатывается агентом CodeDeploy, который вы устанавливаете и настраиваете с помощью файла apppec на своих инстансах EC2 для обработки замены файлов, запуска сценариев до и после установки и запуска обновленного приложения.

Для Lambda настройка CodeDeploy намного проще, хотя вам придется определять свои функции Lambda с помощью шаблона SAM. CodeDeploy может медленно перенаправлять трафик на новую функцию Lambda, используя отдельную версию и настройку псевдонима, чтобы направлять процент трафика на новую версию.

Для ECS необходимо настроить CodeBuild, чтобы автоматизировать сборку контейнера и отправку в AWS ECR. Однако, как только он появится, фактическая настройка так же проста, как выбор вашего кластера ECS. На самом деле для этого даже не обязательно использовать CodeDeploy — можно просто выбрать AWS ECS в качестве поставщика развертывания.

Как настроить CodeDeploy

Далее мы собираемся показать вам процесс настройки EC2, так как остальные очень просты. (Самое сложное для Lambda и ECS — настроить CodeBuild.)

В консоли CodeDeploy создайте новое приложение. Здесь вы должны выбрать развертывание EC2 или Lambda. Из этого приложения вы создаете группу развертывания:

Мастер группы развертывания имеет множество параметров. Дайте ему имя для запуска и перейдите в консоль IAM, чтобы создать роль службы, в которой CodeDeploy будет работать. Выберите «CodeDeploy» в качестве службы и выберите CodeDeploy в качестве варианта использования.

AWS автоматически прикрепляет правильную политику разрешений. Просто нажмите и дайте ему имя. Скопируйте ARN для роли, затем вставьте его в настройки CodeDeploy.

Затем вы должны выбрать, как вы хотите обновлять свои серверы. Есть два основных варианта:

  • In-Place, при котором серверы обновляются без подготовки новых. Скажем, у вас есть 10 серверов; вы можете настроить CodeDeploy для обновления 2 за раз, сохраняя при этом 8 из них работоспособными. Обновляемые серверы отключаются, а трафик перенаправляется на остальные 8 (при условии, что у вас есть балансировщик нагрузки).
  • Синий/зеленый: ваши текущие серверы остаются на месте, а дополнительные серверы медленно запускаются с обновленным кодом. Как только новый «зеленый» сервер подключается к сети, один из старых «синих» серверов отключается.

Оба имеют свои плюсы и минусы. Каждый из них стоит примерно одинаково, но синий/зеленый стоит немного дороже, если вы хотите поддерживать быстрый откат, так как вам нужно оставить старые серверы работать некоторое время. Технически, вы платите дополнительно за время, необходимое для загрузки ваших зеленых серверов, но это не должно быть слишком много, если вы немедленно отключите синие серверы.

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

In-Place проще и работает с зарезервированными экземплярами, но он всегда оставляет вас с отключенным по крайней мере одним из ваших серверов. Синий/зеленый не поддерживает зарезервированные экземпляры, но работает лучше, если у вас всего несколько серверов. Выбор за вами, но в основном они одинаковы в настройке.

Вы можете более точно управлять параметрами развертывания с помощью конфигурации развертывания. Для EC2 есть три значения по умолчанию:

  • Все сразу, что следует использовать только с синим/зеленым, если только вы не любите недовольных клиентов.
  • Половина за раз, что обеспечивает работоспособность 50 % ваших хостов.
  • По одному, что медленно, но наиболее безопасно.

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

После того, как это настроено, вам нужно выбрать серверы, на которых вы фактически развертываете. Если вы настраиваете это, у вас, скорее всего, настроено автоматическое масштабирование, поэтому выберите группу автоматического масштабирования, которую вы пытаетесь обновить.

В противном случае вы можете выбрать инстансы EC2 вручную по тегу и значению.

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

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

Теперь CodeDeploy должен быть настроен и готов к интеграции в остальную часть конвейера.

Чтобы CodeDeploy делал что-то значимое, вам необходимо установить агент CodeDeploy на свои серверы. На самом деле, вы должны интегрировать его в свой сценарий создания инстанса или пользовательский AMI, иначе вы не сможете использовать автоматическое масштабирование или сине-зеленое развертывание.

Вам также необходимо написать файл с именем appspec.yml и поместить его в исходный код вашего репозитория. По сути, этот файл сообщает агенту CodeDeploy, что куда копировать, что запускать для запуска приложения и какие сценарии запускать до и после установки. В некотором смысле это работает так же, как Dockerfile.

Базовая структура выглядит следующим образом:

version: 0.0
os: linux
files:
  - source: Config/config.txt
    destination: /webapps/Config
  - source: source
    destination: /webapps/myApp
hooks:
  BeforeInstall:
    - location: Scripts/UnzipResourceBundle.sh
    - location: Scripts/UnzipDataBundle.sh
  AfterInstall:
    - location: Scripts/RunResourceTests.sh
      timeout: 180
  ApplicationStart:
    - location: Scripts/RunFunctionalTests.sh
      timeout: 3600
  ValidateService:
    - location: Scripts/MonitorService.sh
      timeout: 3600
      runas: codedeployuser

Вы можете прочитать наше руководство по написанию файлов apppec и buildspec, чтобы узнать больше.

Подключение CodeBuild к вашему конвейеру

Подключиться к CodePipeline довольно просто. Его можно найти на той же боковой панели, что и все остальные инструменты CodeSuite. Создайте новый конвейер, затем выберите исходный репозиторий. CodePipeline отслеживает изменения в этом репозитории и может запускать автоматическое обновление.

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

На этапе развертывания выберите «AWS CodeDeploy» в качестве поставщика, выберите регион, в котором он будет работать, затем выберите свое приложение и группу развертывания.

Это все необходимые настройки. Как только вы создадите конвейер, он будет запускаться автоматически с тем, что находится в исходном репо. Вы можете запустить его вручную или отправить новые изменения в исходный репозиторий, чтобы вызвать автоматическое изменение.

Следует отметить, что если вы пропустите этап сборки, несобранный исходный код будет отправлен непосредственно в CodeDeploy. Если у вас есть этап сборки, CodeDeploy получит входные данные от CodeBuild, а источник будет включать содержимое сборки.