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

Сине-зеленые развертывания с CloudFront в равной пропорции

Два дистрибутива CloudFront:

Я попытался использовать два отдельных веб-дистрибутива CloudFront: один для статического сайта в корзине s3 (версия A), а другой - для другого статического сайта в корзине s3 (версия B). Я попытался использовать политику взвешенной маршрутизации Route53, в которой я добавил две записи для моей записи www.domain.com Route53: одна указывает на CloudFront Distribution A с весом 0, а другая указывает на CloudFront Distribution B с весом 0. I хочу провести A / B-тестирование.

Используется www.domain.com в качестве альтернативного CNAME для распространения Prod A.

Используется * .domain.com в качестве альтернативного CNAME для дистрибутива Prod B.

Мой контент всегда обслуживается из A. Я хочу, чтобы он подавался из обеих версий в равной пропорции.

Любая помощь по этому поводу?

Вы не можете этого сделать с CloudFront.

tl; dr: ваш подстановочный знак не соответствует именам хостов, для которых определенное конфликтующее имя хоста настроено в другом дистрибутиве.

Вы создали альтернативное имя хоста с подстановочными знаками в дистрибутиве B как попытку обойти это ограничение:

Вы не можете добавить альтернативное доменное имя в дистрибутив CloudFront, если альтернативное доменное имя уже существует в другом дистрибутиве CloudFront, даже если ваша учетная запись AWS владеет другим дистрибутивом.

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html#alternate-domain-names-restrictions

Конечно, есть причина для этого ограничения, и это также объясняет, почему дистрибутив B никогда не увидит ваши запросы, даже если ваша конфигурация DNS работает должным образом.

Исключение из правил ...

Однако вы можете добавить альтернативное доменное имя с подстановочными знаками, например * .example.com, которое включает (которое перекрывается) альтернативное доменное имя без подстановочных знаков, например www.example.com. Перекрывающиеся доменные имена могут находиться в одном или нескольких дистрибутивах, если оба дистрибутива были созданы с использованием одной и той же учетной записи AWS.

... не предусматривает ожидаемого вами исключения.

Когда веб-браузер подключается к конечной точке, как браузер, полученный там, не сохраняется - была ли это статическая запись A, псевдоним, CNAME, целый каскад CNAME или запись в вашем файле hosts? Сервер не знает, потому что эта информация не сохраняется ... Он знает IP-адрес, на который вы прибыли, но это из пула, совместно используемого многими дистрибутивами, поэтому как ваш запрос попал на конкретный край CloudFront (который установил записей DNS, ваши «A» или «B» - они могут даже не быть разными IP-адресами на стороне CloudFront) - это не то, что можно использовать для определения того, какой дистрибутив должен обслуживать ваш запрос.

Единственный механизм, который CloudFront имеет для определения того, какой дистрибутив должен обслуживать конкретный запрос, - это HTTP. Host: заголовок во входящем http-запросе (возможно, также согласование SNI, но это ничего не меняет, независимо от того, использует ли его CloudFront).

Решение о том, чтобы считать запрос принадлежащим определенному дистрибутиву, не основывалось ни на чем другом - этого не может быть, поскольку нет ничего другого, на котором он мог бы основываться.

По логическому расширению, только одно распределение может быть связано с любым заданным входящим запросом. Host: заголовок, например www.example.com (ваш дистрибутив "А.")

Другой дистрибутив («Б»), *.example.com фактически может обслуживать только запросы на все кроме www.example.com (или любые другие более конкретные альтернативные доменные имена, которые вы связали с дистрибутивами, которые в противном случае соответствовали бы этому подстановочному знаку), потому что другой дистрибутив в той же учетной записи с более конкретным связанным именем хоста («A») требует конкретного имени хоста www.example.com как исключение из * подстановочный знак.

По сути, запросы сначала проверяются на предмет распределения с точным совпадением имени хоста, и только при отсутствии совпадения для запроса может использоваться распределение с подстановочным знаком.

У меня есть одно решение: я пробовал использовать две разные службы. Там, где я добавил две записи для моей записи www.domain.com Route53: одна указывает на CloudFront Distribution A с весом 0, а другая указывает непосредственно на корзину s3 (www.domain.com) в местоположении B с весом 0. WRR работает. Но я не думаю, что мы можем использовать стиль WRR S3 / Cloudfront, потому что производительность будет настолько различаться между ними, что A / B-тестирование не будет справедливым по отношению к версии S3. Клиенты получат гораздо лучшее время отклика от пограничных серверов Cloudfront.

У меня есть еще один вариант - настроить политику трафика в Route 53. Думаю, мне стоит пойти на это. Есть ли другой вариант, который я могу попробовать и который отвечает требованиям AB Testing и является экономически эффективным?