it-swarm.com.ru

Как разместить страницу обслуживания для AWS, когда ваши экземпляры находятся за ELB?

Как вы создаете страницу обслуживания в AWS, когда хотите развернуть новые версии своего приложения за ELB? Мы хотим, чтобы трафик ELB направлялся к экземпляру обслуживания, пока появляются новые автоматически масштабируемые экземпляры, и только «переключается» на новые экземпляры, когда они полностью подключены. Мы используем автоматическое масштабирование, чтобы отключить существующие экземпляры и новые экземпляры с новым кодом.

Сценарий, которого мы пытаемся избежать, заключается в том, чтобы ELB обслуживал как трафик к новым экземплярам EC2, так и обслуживая страницу обслуживания. Поскольку у нас не разрешены липкие сеансы, мы хотим предотвратить переворачивание пользователя между страницей режима обслуживания и приложением, развернутым в экземпляре EC2. Мы также не можем просто увеличить (скажем, от 2 до 4 экземпляров, а затем обратно до 2), чтобы представить новые экземпляры, потому что изменения кода могут включать изменения базы данных, которые будут нарушать изменения для старого кода. 

30
BestPractices

Самый простой способ на AWS - использовать Route 53 , их службу DNS.

Вы можете использовать функцию Weighted Round Robin .

«Вы можете использовать WRR для запуска серверов в производство, проведения A/B-тестирования, Или балансировки трафика между регионами или центрами обработки данных различных размеров ».

Дополнительная информация в Документация AWS по этой функции

Правка: Route 53 недавно добавил новую функцию, которая позволяет DNS Failover на S3. Проверьте их документацию для получения более подробной информации: http://docs.aws.Amazon.com/Route53/latest/DeveloperGuide/dns-failover.html

21
Guy

Route53 не является хорошим решением для этой проблемы. Срок действия записей DNS истекает до того, как появляется страница обслуживания (и затем столько же времени, прежде чем они обновляются после завершения обслуживания). Я понимаю, что триггеры Lambda и CodeDeploy не существовали в то время, когда задавался этот вопрос, но я хотел, чтобы другие знали, что Lambda можно использовать для создания относительно чистого решения для этого, которое я подробно описал в сообщении в блоге: http://blog.ajhodges.com/2016/04/aws-lambda-setting-teven.html

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

7
asdag8

Придумал другое решение, которое отлично работает для нас. Вот шаги:

  1. Скопируйте свою среду EB, чтобы создать другую, назовите ее, например, как app-environment-maintenance.
  2. Измените конфигурацию для автоматического масштабирования и установите минимальный и максимальный серверы на ноль. Это не будет стоить вам никаких серверов EC2, и среда станет серой и окажется в вашем списке.
  3. Это требование, но мы используем Cloudfront, как и многие другие пользователи HTTPS и т.д. В Cloudfront есть страницы с ошибками.
  4. Создайте новое хранилище веб-сайтов S3 с вашими страницами ошибок. Подумайте о создании отдельных файлов для кодов ответов, 503 и т.д. См. № 6 о требованиях к каталогам и маршрутах.
  5. Добавьте корзину S3 в ваш дистрибутив Cloudfront.
  6. Добавьте новое поведение в ваш дистрибутив Cloudfront для маршрута, такого как /error/*.
  7. Настройте страницы ошибок в Cloudfront для обработки кодов ответов 503 и укажите их для маршрута S3, например /error/503-error.html
  8. Наконец, вы можете использовать интерфейс командной строки AWS для замены среды CNAME, чтобы перевести основную среду в режим обслуживания. Например:

    aws elasticbeanstalk swap-environment-cnames \ --profile "$awsProfile" \ --region "$awsRegion" \ --output text \ --source-environment-name api-prod \ --destination-environment-name api-prod-maintenance

Это переключит вашу среду app-prod в режим обслуживания. Это приведет к тому, что ELB сгенерирует 503, поскольку нет запущенных экземпляров EC2, а затем Cloudfront перехватит 503 и вернет соответствующую страницу ошибки 503.

И это все. Я знаю, что есть довольно много шагов, и я попробовал множество предложенных вариантов, включая Route53 и т.д. Но все они имеют проблемы с тем, как они работают с ELB, Cloudfront и т.д.

Обратите внимание, что после того, как вы меняете имена хостов для сред, для распространения требуется около минуты.

5
Jacob Thomason

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

Ранее в этом году AWS представила поддержку перенаправлений и исправила ответы на Application Load Balancers . В двух словах:

  • Найдите свой ELB в консоли.
  • Просмотрите правила для соответствующего слушателя.
  • Добавьте фиксированное правило ответа 503 для имени хоста вашего приложения.
  • При необходимости укажите ответ text/plain или text/html (т. Е. HTML-страницу вашей страницы поддержки).
  • Сохранить изменения.

Как только правило распространяется на ELB (у меня это заняло ~ 30 секунд), когда вы пытаетесь зайти на хост в своем браузере, вы увидите страницу обслуживания 503.

По завершении развертывания просто удалите добавленное вами правило.

2
Tom

Наш процесс развертывания сначала запускает облачную информацию, чтобы ускорить микроэкземпляр ec2 (экземпляр обслуживания), который копирует предварительно определенную статическую страницу из s3 в ec2. Облачная информация поставляется с elb's, к которому прикреплен экземпляр micro ec2. Затем запускается скрипт (powershell или cli) для удаления веб-экземпляров (ec2) из ​​оставленного экземпляра обслуживания elb.

Таким образом мы переключаемся на экземпляр обслуживания во время процесса развертывания. 

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

1
Rajesh Cheedalla