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

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

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


person BestPractices    schedule 03.12.2012    source источник


Ответы (6)


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

Вы можете использовать функцию Weighted Круговая система.

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

Дополнительную информацию см. В документации AWS по этой функции

РЕДАКТИРОВАТЬ: Route 53 недавно добавил новую функцию, которая позволяет DNS Failover на S3. Дополнительную информацию см. В их документации: http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html

person Guy    schedule 04.12.2012
comment
Непонятно, как это будет работать - не могли бы вы расширить свой ответ? (Обратите внимание, у нас в стеке настроен Route 53, просто неясно, как мы будем использовать взвешенный циклический перебор, чтобы обслуживать только некоторые экземпляры EC2 за раз) - person BestPractices; 04.12.2012
comment
то есть наши экземпляры EC2 находятся за одним ELB - person BestPractices; 04.12.2012
comment
Парень, вероятно, имеет в виду, что у вас будет 2 ресурса в наборе записей DNS: один для ELB, а второй - для страницы обслуживания. Перейдя в «режим обслуживания», вы значительно увеличите вес службы страницы обслуживания. Это означает, что другой маршрут (ваш ELB) не получит подключений. По окончании обслуживания вы сбрасываете вес страницы на ноль. - person Froyke; 04.12.2012
comment
Ах, я должен был разобраться в этом самостоятельно. Спасибо за разъяснение @Froyke! - person BestPractices; 04.12.2012
comment
Для всех, кто читает только этот ответ, прочитайте и другие ответы, поскольку AWS добавила гораздо больше возможностей с тех пор, как это было опубликовано, в том числе совершенно другой вариант, который хорошо работает (в основном, ALB также могут помочь в достижении этого) - person BestPractices; 10.01.2019

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

Ранее в этом году AWS представила поддержку перенаправляет и фиксирует ответы балансировщикам нагрузки приложений. В двух словах:

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

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

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

person Tom    schedule 17.12.2018
comment
ОП здесь ... спасибо, что добавили этого Тома. Когда появились ALB и эта функция, мы решили сделать что-то очень похожее (но в основном это) в качестве нашего решения. - person BestPractices; 10.01.2019
comment
Также использую эту стратегию. Это просто и отлично работает. - person mawaldne; 27.01.2020

Придумали еще одно решение, которое нам отлично подходит. Вот необходимые шаги, чтобы получить простой ответ 503 http:

  1. Реплицируйте вашу среду EB, чтобы создать другую, например, назовите ее как-нибудь вроде app-environment-maintenance.
  2. Измените конфигурацию автомасштабирования и установите минимальный и максимальный серверы на ноль. Это не будет стоить вам каких-либо серверов EC2, и среда станет серой и попадет в ваш список.
  3. Наконец, вы можете использовать интерфейс командной строки AWS, чтобы поменять местами CNAME среды, чтобы перевести основную среду в режим обслуживания. Например:

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

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


Дополнительная конфигурация для настраиваемых страниц ошибок с помощью Cloudfront:

Мы используем Cloudfront, как и многие люди для HTTPS и т. Д. Cloudfront имеет страницы с ошибками. Это требование.

  1. Создайте новую корзину хостинга веб-сайтов S3 с вашими страницами ошибок. Рассмотрите возможность создания отдельных файлов для кодов ответов, 503 и т. Д. См. № 6 для получения информации о требованиях к каталогам и маршрутах.
  2. Добавьте корзину S3 в свой дистрибутив Cloudfront.
  3. Добавьте новое поведение в свой дистрибутив Cloudfront для маршрута типа /error/*.
  4. Настройте страницы ошибок в Cloudfront, чтобы обрабатывать коды ответов 503 и указывать их на маршрут вашего сегмента S3, например /error/503-error.html

Теперь, когда ваш ELB выполнит ошибку 503, отобразится ваша пользовательская страница ошибки.

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

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

person Jacob Thomason    schedule 24.09.2017
comment
Отличный подход для Elastic Beanstalk! А если вам не нужно фантазировать, просто позвольте подсистеме балансировки нагрузки EB напрямую предоставить вашу страницу 503 Service Tempoporary Unavailable (путем масштабирования до нуля). В этом случае вам нужны только шаги 1, 2 и 8 (и 8 можно также выполнить в графическом интерфейсе пользователя EB). Другой вариант - развернуть простой настраиваемый сервер страницы обслуживания в среде обслуживания. - person Brent Bradburn; 05.06.2019
comment
@nobar, ты прав. Если вы не хотите ничего особенного, например настраиваемой страницы ошибок, отображаемой для пользователей, шаги 1, 2 и 8 - это все, что вам нужно. Я обновлю пост, чтобы он стал более понятным. - person Jacob Thomason; 06.06.2019

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

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

person asdag8    schedule 26.04.2016
comment
Это зависит от того, используете ли вы запись псевдонима в Route 53. Как только произойдет сбой работоспособности, клиент не увидит задержки для переключения на другой ресурс (если он настроен с записью псевдонима Route 53) - person BestPractices; 27.04.2016
comment
Предполагается, что вы используете события CodeDeploy. - person Alex; 26.05.2016

Насколько я мог видеть, мы оказались в ситуации, когда приведенные выше ответы неприменимы или не идеальны.

У нас есть приложение Rails, работающее под управлением Puma с Ruby 2.3, работающее на 64-битной Amazon Linux / 2.9.0, которое, похоже, поставляется с (классическим) ELB.

Так что использование ALB 503 не подходило.

У нас также есть множество аппаратных клиентов, которым я бы не стал доверять, чтобы всегда уважать TTL DNS, поэтому использование Route53 рискованно.

Что действительно хорошо работает, так это дополнительный порт на nginx, который поставляется с платформой.

Я добавил это как .ebextensions/maintenance.config

files:
  "/etc/nginx/conf.d/maintenance.conf":
    content: |
      server {
        listen 81;
        server_name _ localhost;
        root /var/app/current/public/maintenance;
      }

container_commands:
  restart_nginx:
    command: service nginx restart

И сбросил копию https://gist.github.com/pitch-gist/2999707 в public/maintenance/index.html

Теперь, чтобы установить обслуживание, я просто переключаю свои прослушиватели ELB так, чтобы они указывали на порт 81 вместо 80 по умолчанию. Никаких дополнительных экземпляров, сегментов s3 или ожидания клиентов на новый DNS.

Для применения beanstalk (вероятно, в основном, ожидая облачной информации в серверной части) требуется около 15 секунд или около того.

person Mat Schaffer    schedule 08.04.2019
comment
Как вы справились с проверкой здоровья? Мой ELB выходит из строя из-за сбоя проверки работоспособности. Я вручную изменил проверку работоспособности на TCP: 81, но это не сработало. - person nmott; 05.09.2019
comment
В моем случае приложение все еще подвергалось проверке работоспособности, так что это не было проблемой. Ваш подход должен работать. Если ELB не может подключиться к вторичному порту nginx, я бы проверил (1) правила группы безопасности (может ли выходить на 81, разрешает ли экземпляр sg вход 81), (2) nginx определенно прослушивает (потребуется перезапуск) - person Mat Schaffer; 17.09.2019

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

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

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

person Rajesh Cheedalla    schedule 20.01.2017