Подтвердить что ты не робот

Лучший способ управления изменениями кода для приложения в Amazon EC2 с автоматическим масштабированием

У меня есть несколько экземпляров, работающих за балансировщиком нагрузки с автоматическим масштабированием в AWS.

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

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

Любые указатели в этом направлении будут высоко оценены.

4b9b3361

Ответ 1

Как я могу изменить свой код, нужно иметь мастер-сервер, который я редактирую в коде. Все подчиненные серверы, которые масштабируют, затем rsync через ssh заданием cron, чтобы обновить все файлы. Все серверы синхронизируют каждые 30 минут + - несколько случайных секунд, чтобы не получить доступ к ней в ту же секунду. (обратите внимание, что я оставляю Master от балансировщика нагрузки, поэтому пользователи всегда имеют одинаковый код, который им отправляется. Аналогичным образом, когда я решаю опубликовать изменения моего кода, я делаю rsync с моего тестового сервера на мой главный сервер.

Используя этот подход, вам просто нужно поместить команду sync в start-up, и вам не нужно беспокоиться о том, какое состояние кода было на подчиненном изображении, так как оно будет обновляться после его загрузки.

EDIT: Теперь мы прекратили использовать этот метод и начали использовать новый сервис AWS CodeDeploy, который создан для этой цели:

http://aws.amazon.com/codedeploy/

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

Ответ 2

Мы настраиваем нашу конфигурацию запуска для использования "чистого" готового AMI - мы используем следующие: http://aws.amazon.com/amazon-linux-ami/

Одной из особенностей этих AMI является CloudInit - https://help.ubuntu.com/community/CloudInit

Эта функция позволяет нам доставлять на вновь созданный простой ванильный экземпляр EC2 некоторые данные. В частности, мы даем экземпляр script для запуска.
script (в двух словах) делает следующее:

  • Модернизирует себя (чтобы убедиться, что все исправления безопасности и исправления ошибок применяются).
  • Устанавливает Git и Puppet.
  • Отбрасывает репозиторий Git из Github.
  • Применяет марионетку script (которая является частью репо) для настройки самой. Кукольный устанавливает остальные необходимые программные модули.

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

Теперь, чтобы обновить программное обеспечение, мы используем локальный boto script. script убивает серверы, запускающие старый код один за другим. Механизм автоматического масштабирования запускает новые (и обновленные) серверы.

Обязательно используйте as-terminate-instance-in-auto-scaling-group, потому что использование ec2-terminate-instance приведет к тому, что ELB продолжит отправлять трафик на экземпляр закрытия, пока он не завершит проверку работоспособности.

Интересное связанное сообщение в блоге: http://blog.codento.com/2012/02/hello-ec2-part-1-bootstrapping-instances-with-cloud-init-git-and-puppet/

Ответ 3

Кажется, вы можете вручную удвоить размер группы автомасштабирования, он будет создавать экземпляры EC2 с использованием AMI из текущей конфигурации запуска. Теперь, если вы уменьшите группу автоматического масштабирования до прежнего размера, старые экземпляры будут убиты, и только экземпляры, созданные из нового AMI, выживут.