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

Автоматизация развертывания войны в частной подсети VPC на tomcat7

у меня есть VPC с общедоступными и частными подсетями.

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

Руководство

  1. Я загружаю новый файл войны в ведро S3
  2. SSH в Bastion сервер (только это может быть SSHed)
  3. отсюда SSH в частный экземпляр
  4. Загрузите файл войны с S3, остановите tomcat7, замените старую войну (и удалите каталог)
  5. Запустите кота

Я повторяю вышеуказанные шаги для каждого экземпляра (в настоящее время 3 экземпляра)

Полу руководство Вот шаги

  1. Загрузить новую войну в ведро S3
  2. Убить экземпляр (из панели управления веб-сайта AWS)
  3. Конфигурация масштабирования и запуска запускается автоматически, чтобы поддерживать минимальное количество экземпляров. Это запускает новый экземпляр и выполняет скрипт, который фактически загружает войну из S3 и некоторых других настроек среды, папки и т. Д.
  4. Когда я вижу, что новый экземпляр создан, запущен и добавлен в ELB, я убиваю другой старый экземпляр.
  5. Таким образом, я убиваю все старые экземпляры один за другим, и они заменяются новым экземпляром с последними обновлениями.

Первый способ быстрый, но требует большого количества ручных действий. SSH-вход и выход из экземпляров (SSH в экземплярах разрешен только с сервера BASTION). скачать, остановить, заменить, запустить.

Второй метод медленный и не автоматический. Старое время завершения инстанса + Время запуска нового инстанса + Развертывание новой войны

Я хочу добиться следующих целей

  1. Автоматизируйте процесс обновления (нажмите кнопку)
  2. Люди, не являющиеся разработчиками, такие как QA и Support, могут обновиться без доступа к веб-сайту AWS или SSH-ключам.
  3. Быстрое обновление
  4. Откат в случае неудачи

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

Вот мои причины (некоторые вещи могут быть просто моим предположением или отсутствием знаний).

  1. Общая архитектура приложения сложный, VPC содержит 9 подсетей и множество экземпляров ec2 в частных и общедоступных подсетях. и сложная настройка безопасности с использованием групп безопасности
  2. Мое собственное наименование соглашение для подсетей (Public_Subnet_A, Public_Subnet_B, Private_WEB_A, Private_WEB_B, Private_API_A, SG_GLOBAL, SG_BASTION, SG_BASTION и многие другие). Я не вижу способа сделать это в ElasticBeanstalk.
  3. Поддержка только Beanstalk ограничена предопределенные шаблоны для заранее определенных сред. Как будто я хочу, чтобы мои экземпляры были основаны на Ubuntu, с Tomcat7, с Java6 или 7 и некоторыми другими.
  4. Приложение Beanstalk для Java запускает tomcat8, amazon-instance, оно также держит tomcat позади Apache (и я думаю, что мост выполняется через mode_jk), а затем этот Apache находится за ELB. И я думаю, что ELB-> Apache-mode_jk-> tomcat немного излишне (я ошибаюсь).
  5. Я использую подход ELB-> tomcat
  6. Мой исходящий трафик проходит NATing server, Внешний мир не может (теоретически) узнать экземпляры.
  7. К экземплярам beanstalk можно обращаться напрямую. но в моей среде это невозможно, вы можете только ssh БАСТИОН экземпляр с определенного IP-адреса с ssh-ключом и некоторым sudo-random именем пользователя (я думаю, это трудно угадать), а частные экземпляры могут быть подключены по SSH только через BASTION (настраиваемая конфигурация группы безопасности).
  8. Точно так же мой экземпляр RDS также находится в одной из моих назначенных частных подсетей, и только экземпляры приложения API могут подключаться к базе данных (вам было сказано много настраиваемой конфигурации).
  9. Есть и другие.

Теперь вы знаете предысторию. Давайте придерживаться простой версии примера, который я объяснил вверху.

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

Единственное, о чем я могу думать, - это написать ANT-скрипт или какой-то Java-код, который может выполнять все шаги, описанные в первом методе. хотя не уверен, что им разрешат выполнять эти операции с aws.

Используйте CodeDeploy, у вас уже есть война в ведре S3, поэтому единственное, что вам нужно, это aws cli https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html команда.

Чтобы это работало, вам понадобится агент CodeDeploy на экземпляре - вы можете следовать этому https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html

Агенту CodeDeploy требуется один простой файл конфигурации и по крайней мере один сценарий конфигурации (cp .war файл для Tomcat + перезагрузка службы).

CodeDeploy может обновлять экземпляры на основе тега или в группе автомасштабирования. Я также предлагаю поместить ваши экземпляры в группу автомасштабирования, но это можно сделать в качестве второго шага.

Можно удалить экземпляр из ELB (ожидания) перед обновлением и вернуть его после обновления, чтобы у вас было нулевое время простоя. Вместе с проверками работоспособности вы можете получить полностью автоматизированное решение.

С CodeDeploy вы можете иметь функции, аналогичные Beanstalk, но при этом сохраняя гибкость прямого доступа к экземпляру и использования собственных шаблонов. Экземпляры также не обязательно должны быть доступны из Интернета.

Та же проблема, потратив около двух дней, я понял, что есть плагин под названием Publish artifacts over SSH для jenkins (если у вас есть CI) и внес некоторые изменения в конфигурацию, чтобы позволить NAT разговаривать с сервером jenkins, по крайней мере, это помогло меня.

У меня такая же настройка, как у серверов в частной подсети и NAT в публичной подсети, откуда я использую ssh для развертывания войны на частных машинах.

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