Два дистрибутива 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 владеет другим дистрибутивом.
Конечно, есть причина для этого ограничения, и это также объясняет, почему дистрибутив 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 и является экономически эффективным?