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

Как временно перенаправить трафик с Elastic Load Balancer?

Я запускаю приложение на Elastic Beanstalk, и всякий раз, когда мне нужно развернуть новую версию, мне нужно:

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

Можно ли временно перенаправить трафик ELB в другое место? Выполнять ли перенаправление HTTP, например, в корзину S3, или читать из этого ведра вместо экземпляра EC2?

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

Таким образом, в идеале DNS всегда должен указывать на ELB, а затем ELB должен переключать трафик в реальном времени в другое место только на время обновления.

Вы можете использовать замену URL-адресов среды, описанную здесь:

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.CNAMESwap.html

Загрузите новую версию на второй beanstalk и поменяйте URL-адреса или разверните сайт обслуживания на втором beanstalk и переключитесь на него - весь трафик перенаправляется в новую среду.

AFAIK, нет способа сделать это таким образом.

Однако я нашел альтернативное решение, которое ставит для меня все флажки.

Я обновил фронт-контроллер своего приложения, чтобы читать переменную среды, APP_MAINTENANCE, и вернуть 503 Service Unavailable ответ, если эта переменная TRUE.

Исправление базы данных выполняется через container_commands и выполняется автоматически во время развертывания.

Теперь процедура развертывания следующая, используя API эластичного бобового стебля:

  • Использовать UpdateEnvironment установить APP_MAINTENANCE к TRUE
  • Подождите, пока среда не будет готова (используя DescribeEnvironments)
  • Использовать UpdateEnvironment развернуть новую версию приложения
  • Подождите, пока среда не будет готова
  • Использовать UpdateEnvironment установить APP_MAINTENANCE к FALSE.

Таким образом, я могу быть уверен, что ничто не использует базу данных во время обновления базы данных. В течение этого периода времени (около 3 минут) приложение недоступно, и любой запрос возвращается 503 ответ, который приемлем в моем случае использования.

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

Вы также можете настроить группу безопасности на балансировщике нагрузки на временную блокировку общего доступа. Не элегантно, но работает.