Я запускаю приложение на 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 эластичного бобового стебля:
APP_MAINTENANCE
к TRUE
UpdateEnvironment
развернуть новую версию приложенияUpdateEnvironment
установить APP_MAINTENANCE
к FALSE
.Таким образом, я могу быть уверен, что ничто не использует базу данных во время обновления базы данных. В течение этого периода времени (около 3 минут) приложение недоступно, и любой запрос возвращается 503
ответ, который приемлем в моем случае использования.
Любому клиенту, получившему этот ответ, предлагается повторить попытку через несколько минут, будь то реальный человек (это будет предложено в дружественном сообщении) или потребитель API (HTTP предполагает, что это временный сбой и что клиент должен повторите попытку позже).
Вы также можете настроить группу безопасности на балансировщике нагрузки на временную блокировку общего доступа. Не элегантно, но работает.