Canary Release и Blue Green Deployment на AWS
В настоящее время я использую Canary Release и Blue Green Deployment на своем статическом веб-сайте на AWS S3. По сути, я создал два сегмента S3 (v1 и v2) и два фронта облака (я не добавил CNAME). Затем я создаю 2 записи псевдонима A в маршруте 53 с 50% каждой политикой маршрутизации веса. Однако меня перенаправили на v1, используя только ноутбук и мобильный телефон для доступа к своему домену. Я даже прошу коллегу открыть мой домен, и они также перенаправляются на v1.
Меня действительно озадачило, почему ни одного пользователя не направляют на v2?
AWS Static Web в S3
2 ответа
Назначенный dyyyexample.cloudfront.net
а также dzzzexample.cloudfront.net
Имена хостов, которые направляют трафик в ваши дистрибутивы CloudFront, отправляются в одно и то же место. CloudFront не может видеть ваши записи псевдонимов DNS, поэтому он не знает, какой псевдоним использовался.
Вместо этого он смотрит на TLS SNI и HTTP Host
заголовок браузер отправляет. Он использует эту информацию для сопоставления с альтернативным доменным именем вашего дистрибутива - без изменений в DNS.
Имя хоста вашего сайта, example.com
, настраивается в качестве альтернативного имени домена только в одном из ваших дистрибутивов, поскольку CloudFront не позволяет предоставлять одно и то же значение более чем в одном дистрибутиве.
Если вы поменяете эту запись альтернативного имени домена на другой дистрибутив, весь трафик будет перемещен в другой дистрибутив.
Короче говоря, CloudFront не поддерживает напрямую Blue-Green или Canary.
Обходной путь - использовать триггер Lambda@Edge и файл cookie, чтобы привязать каждого зрителя к тому или иному источнику. Триггер запроса источника Lambda@Edge позволяет изменить источник, пока запрос находится в полете.
В документации есть пример A/B-тестирования, но этот пример меняет путь. См. Примеры выбора динамического источника, чтобы узнать, как поменять источник. Комбинация логики этих двух позволяет A/B-тестирование через два сегмента (или любые два альтернативных серверных конца).
То, что вы объясняете, должно работать, если вы используете «перекрывающиеся псевдонимы» в Cloudfront. Вы настраиваете один дистрибутив на прослушивание app.example.com, а другой - на * .example.com и используете взвешенную маршрутизацию Route53 для app.example.com.
Однако взвешенная маршрутизация может быть не идеальным решением для канареечных релизов. Это связано с распространением / кешированием DNS и тем, что он не липкий.
Как и предлагает Майкл, вы можете захотеть иметь 1 облачный фронт и маршрутизацию в сегмент A / B с помощью функций Lambda @ Edge или Cloudfront. Вот пример.