Моя цель
У меня есть несколько доменов (например, 10 или 20), и я хочу перенаправить Любые посетители везде на этих страницах на одну страницу в другом домене (например, на моей странице профиля stackoverflow.com).
Это включает в себя
- вершинный домен с использованием
http
(например. http://mydomain01.com
)
- вершинный домен с использованием
https
(например. https://mydomain01.com
)
- поддомены с использованием
http
(например. http://www.mydomain01.com
или же http://blog.mydomain01.com
)
- поддомены с использованием
https
(например. https://www.mydomain01.com
или же https://blog.mydomain01.com
)
- любые пути (напр.
http://mydomain01.com/some_path
или же https://www.mydomain01.com/another/path.html
)
плюс то же самое для всех моих других доменов (мойдомен02.com
, мойдомен03.com
, и т.д.; каждый с вышеуказанными вариантами использования).
Мое исследование
- Эта статья об AWS объясняет, как перенаправить интернет-трафик с домена вершины на другой домен (случай № 1 в моем Это включает в себя список выше) используя АВС S3 и Маршрут AWS 53: Это работает для
http
, но не для https
.
- Эта статья об AWS объясняет, как перенаправить интернет-трафик для ряда случаев (судя по всему, охватывает все случаи в моем Это включает в себя список выше) используя АВС S3, Маршрут AWS 53 и AWS CloudFront: Это работает для обоих
http
и https
. (Также говорится об использовании балансировщика нагрузки приложений, но я думаю, что это выходит за рамки здесь...)
- Эта статья об AWS добавляет некоторые дополнительные сведения о настройке базы раздачи CloudFront и о том, как получить представление о файлах журналов.
- Эта статья об AWS правила перенаправления документов для использования расширенных условных перенаправлений: не уверен, нужно ли мне идти туда для достижения моей цели, поэтому еще не изучал это.
Плюс, очевидно, есть много вопросов SO (см. Связанный справа от этого вопроса) и другие посты по теме; проблема с большинством из них заключается в том, что они используют снимки экрана из предыдущих версий пользовательского интерфейса консоли AWS: большая часть содержимого должна оставаться прежней, но сопоставление этих снимков экрана с текущим пользовательским интерфейсом IMO добавляет еще один уровень путаницы.
Основные выводы из документов AWS (и других):
- Мне нужно создать ведро в AWS S3 и настроить в нем перенаправление,
- Мне нужно создать дистрибутив в AWS CloudFront;
- чтобы использовать собственный домен в CloudFront, мне нужно создать сертификат в AWS ACM,
- Мне нужно создать размещенную зону в AWS Route 53 и настроить в ней записи.
Моя работа до сих пор
Установлен последний интерфейс командной строки AWS, область
и вывод
настроены в ~/.aws/config
, учетные данные настраиваются в ~/.aws/учетные данные
(каждый для каждой учетной записи AWS); АМС_*
переменные среды находятся экспорт
изд.
Я использую регион AWS Восток США (Северная Вирджиния) (us-east-1)
для всего, чтобы предотвратить любые дополнительные проблемы, вызванные отсутствием ресурсов AWS в регионе.
$ авс --версия
aws-cli/2.2.23 Python/3.9.6 Darwin/19.6.0 source/x86_64 приглашение/выкл.
Я опускаю любые подсказки оболочки или >
символы продолжения строки оболочки для облегчения копирования из этого поста в оболочку.
Настройка корзины S3
Предупреждение: Это создает «общедоступную» корзину без каких-либо ограничений доступа. В данном случае это не имеет значения, так как нет содержимого корзины для защиты, но такая публичная корзина в целом является плохой практикой. Кроме того, я использую общедоступную корзину, чтобы предотвратить дополнительные проблемы, вызванные ограничениями доступа: Во-первых, заставить его работать; во-вторых, сделать его безопасным.
создать ведро
aws s3api create-bucket --bucket mydomain01.com
{
«Местоположение»: «/mydomain01.com»
}
настроить перенаправление
aws s3api put-bucket-website --bucket mydomain01.com --website-configuration \
'{ "RedirectAllRequestsTo": { "HostName": "stackoverflow.com/users/217844/ssc" } }'
Попался: Имя корзины S3 должно совпадать с именем домена вершины.
Использование любого имени корзины, но мойдомен01.com
(для моего примера), похоже, не работает без каких-либо указаний на причину. Документы AWS на самом деле не делают это очень ясным - на самом деле, я все еще не уверен, что я что-то неправильно понимаю здесь, но, насколько я могу судить, официальная документация AWS на самом деле несколько небрежна в этом - ИМО - ключевой момент : Например, #2 просто говорит
- Создайте корзину S3 с глобальным уникальным именем.
что может быть Любые глобально уникальное имя. #1 каким-то образом упоминает об этом - как только вы узнаете, как читать эти биты...
Кстати, эта статья № 2 продолжает меня смущать.
Если вы не используете личный домен...
Почему я должен нет использовать личный домен ?!? Весь смысл в том, чтобы перенаправить мой пользовательский домен, не так ли?!? Ну во всяком случае...
Попался: Не следует добавлять протокол к имени хоста.
Ни консоль AWS, ни интерфейс командной строки AWS не проверяют, работает ли протокол (http://
или же https://
) был внесен в Имя хоста Поле пользовательского интерфейса / передано в Имя хоста
JSON-строка. Однако, если он добавлен в начале, перенаправление завершается ошибкой; видеть тестовое перенаправление ниже.
Попался: Ошибка пользовательского интерфейса консоли AWS S3.
После настройки перенаправления в консоли AWS в пользовательском интерфейсе отображается интерактивная ссылка на URL корзины (http://mydomain01.com.s3-website-us-east-1.amazonaws.com
) на самом дне ведра Характеристики вкладка, в Хостинг статических сайтов раздел.
При нажатии на эту ссылку страница не открывается, по-видимому, потому, что консоль AWS искажает URL-адрес и пытается открыть http://https//stackoverflow.com/users/217844/ssc/
, независимо от протокола.
тестовое перенаправление
- с использованием
HTTPie
в оболочке вместо завиток
или же wget
потому что это то, что сейчас используют крутые дети
- скопируйте ссылку из консоли AWS в браузере в оболочку
http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 перемещен навсегда
Длина содержимого: 0
Дата: пн, 02 августа 2021 г., 12:39:09 по Гринвичу
Расположение: http://stackoverflow.com/users/217844/ssc/
Сервер: AmazonS3
x-amz-id-2: rakAqUMnRraGvo/WkSa6AnbuhWn/9YZX/CALI/OJQKYoWp/OdQIbyhsvHSwNved3suwMdgglqpE=
x-amz-идентификатор запроса: C5BBG833Q9TQ9J6X
--> вроде работает
- проверить перенаправление, если протокол был ошибочно добавлен перед именем хоста; обратите внимание на сломанный
Место расположения
URL:
http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 перемещен навсегда
Длина содержимого: 0
Дата: понедельник, 02 августа 2021 г., 12:52:10 по Гринвичу
Расположение: http://https://stackoverflow.com/users/217844/ssc/
Сервер: AmazonS3
x-amz-id-2: Ee2/ob0faTpRdp6mGITdmClozXNmF1Q2oTbPioms8O91VA8n5VA3MoHhveeFz7v2VS65YKFKlDA=
x-amz-идентификатор запроса: ZJP653R50YD5HSRS
Мои вопросы №1
ПРИМЕЧАНИЕ. У меня были эти вопросы, когда я начал писать это; я считать Я смог ответить на них сам, так как (см. тестовое задание www
запись поддомена ниже). Кто-нибудь, поправьте меня, если я ошибаюсь:
- Вопрос: Применяется ли требование «имя корзины == имя домена», даже если я использую CloudFront?
А: Да.
- Вопрос: Нужно ли мне создавать по одному сегменту для домена вершины и каждого поддомена? так, в моем примере
мойдомен01.com
www.mydomain01.com
blog.mydomain01.com
?
А: Да.
Настройка зоны хостинга Route 53
создать размещенную зону
aws route53 create-hosted-zone --caller-reference "$(date '+%Y%m%d-%H%M%S')" --name mydomain01.com
{
«Местоположение»: «https://route53.amazonaws.com/2013-04-01/hostedzone/Z123456789EXAMPLE0SKX»,
"Хостедзон": {
"Идентификатор": "/hostedzone/Z123456789EXAMPLE0SKX",
"Имя": "mydomain01.com.",
"CallerReference": "20210802-150736",
"Конфигурация": {
«Частная зона»: ложь
},
«Ресурсеррекордсеткаунт»: 2
},
«Информация об изменениях»: {
«Идентификатор»: «/change/C1234567890SKXEXAMPLE»,
"Статус: ожидание",
"SubmittedAt": "2021-08-02T13:07:37.860000+00:00"
},
«Набор делегаций»: {
"Серверы имен": [
"ns-1234.awsdns-12.com",
"ns-5678.awsdns-34.co.uk",
"ns-1234.awsdns-56.net",
"ns-5678.awsdns-78.org"
]
}
}
- обратите внимание на идентификатор размещенной зоны
Z123456789EXAMPLE0SKX
, необходимый на следующих шагах
создать запись для домена вершины
{
"Изменения": [
{
"Действие": "СОЗДАТЬ",
"ResourceRecordSet": {
"Имя": "mydomain01.com.",
"Наберите "А",
«Псевдоним»: {
"HostedZoneId": "Z3AQBSTGFYJSTF",
"DNSName": "s3-website-us-east-1.amazonaws.com",
«EvaluateTargetHealth»: ложь
}
}
}
]
}
Попался: Должен использовать дословно s3-веб-сайт-нас-восток-1.amazonaws.com
за DNSName
.
Документы AWS во многих местах говорят о пример.com
или же example.com.s3-website-us-east-1.amazonaws.com
и т. д. В этом случае это не какой-то пример, который нужно заменить собственными значениями (например, mydomain01.com.s3-веб-сайт-нас-восток-1.amazonaws.com
), но дословное значение из Таблица, т.е. s3-веб-сайт-нас-восток-1.amazonaws.com
.
Попался: Не следует добавлять протокол к имени хоста.
Как и в предыдущем случае, и консоль AWS, и интерфейс командной строки AWS с радостью принимают протокол (http://
или же https://
) перед значением, введенным в поле Имя хоста Поле пользовательского интерфейса / передается как DNSName
. По крайней мере, это выглядит очень неправильно в консоли, например. http\072\057\057mydomain01.s3-website-us-east-1.amazonaws.com.
Обе проблемы несколько смягчены в консоли AWS, где значения можно выбирать из раскрывающегося списка при создании или редактировании записи; при использовании интерфейса командной строки AWS необходимо дважды проверять отправляемые данные.
Та же самая ошибка и смягчение применимы к Имя записи Поле пользовательского интерфейса / Имя
JSON-значение.
создать запись для домена вершины, продолжение.
- использовать
jq
для быстрого теста временный файл содержит действительный json
jq. <change-batch.apex.json 1> /dev/null
- нет вывода --> действительный JSON
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
--change-batch "файл://$(pwd)/change-batch.apex.json"
{
«Информация об изменениях»: {
"Идентификатор": "/change/C1234567890EXAMPLESKX",
"Статус: ожидание",
"SubmittedAt": "2021-08-02T14:20:09.370000+00:00"
}
}
тестовая запись домена apex
http://mydomain01.com
HTTP/1.1 301 перемещен навсегда
Длина содержимого: 0
Дата: пн, 02 августа 2021 г., 15:06:08 по Гринвичу
Расположение: http://stackoverflow.com/users/217844/ssc/
Сервер: AmazonS3
x-amz-id-2: EfDtCxif2iV4eInskirSBAOjQS7o9arzJCeZjscF6mW7cwwmm9Nxb7QJT50x2kjdslX2fOxA+lk=
x-amz-идентификатор запроса: WM7K9TDEF75A6P1V
--> хорошо выглядит
- тестовое задание
http
с дорожкой
http://mydomain01.com/some/путь
... аналогичный вывод, как указано выше ...
http https://mydomain01.com
http: ошибка: ConnectionError: HTTPSConnectionPool (хост = 'mydomain01.com', порт = 443):
Превышено максимальное количество повторных попыток с URL-адресом: / (вызвано NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x101a48100>):
Не удалось установить новое соединение: [Errno 60] Время ожидания операции истекло')) при выполнении запроса GET к URL-адресу: https://mydomain01.com/
- (ответ завернут для удобочитаемости)
--> тайм-аут (через 60 с?) - как и ожидалось: перенаправление с использованием ведра S3 не работает с https
(см. выше)
Попался: Задержка распространения изменений DNS.
AWS и Google очень быстро с точки зрения распространения изменений в настройках DNS (например, в секундах или минутах), но могут быть задействованы другие, «более медленные» серверы имен. Обходите их, как описано здесь устранить этот источник путаницы. Этот подход работает только в macOS, но концепция одинакова для любой ОС.
Попался: Кэш браузера.
При тестировании изменений DNS не в оболочке, а в браузере, браузер может получить результаты из своего кеша. Я делаю большую часть своей работы с помощью Chrome, но для тестирования использую Firefox (или Safari), поэтому я могу очистить весь кеш перед каждым тестом, чтобы устранить эту потенциальную проблему — без выхода из Google, AWS и т. д.
создать запись для www
поддомен
- единственная разница в том, что
Имя
JSON-значение
sed -e 's|mydomain01.com.|www.mydomain01.com.|g' change-batch.apex.json > change-batch.www.json
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
--change-batch "файл://$(pwd)/change-batch.www.json
- ответ аналогичен приведенному выше
тестовое задание www
запись поддомена
http://www.mydomain01.com
HTTP/1.1 404 не найден
Длина контента: 363
Тип содержимого: текст/html; кодировка = utf-8
Дата: пн, 02 августа 2021 г., 15:28:05 по Гринвичу
Сервер: AmazonS3
x-amz-id-2: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=
x-amz-идентификатор запроса: TK83G35EMYFR8SKX
<html>
<head><title>404 Не найден</title></head>
<тело>
<h1>404 Не найден</h1>
<ул>
<li>Код: NoSuchBucket</li>
<li>Сообщение: указанный сегмент не существует</li>
<li>Имя сегмента: www.mydomain01.com</li>
<li>Идентификатор запроса: TK83G35EMYFR8SKX</li>
<li>Идентификатор хоста: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=</li>
</ul>
<ч/>
</тело>
</html>
- Я думаю, что это ответ на второй из Мои вопросы №1 выше: мне нужно одно ведро S3 на вершину/поддомен для пересылки.
Настройка раздачи CloudFront
создать сертификат
- АМС АСМ
запрос-сертификат
документы
- сертификат должен работать для вершины и всех поддоменов, поэтому необходимо добавить другое имя к этому сертификату / проходят
--subject-альтернативные-имена
; видеть эта статья AWS (верхнее синее поле).
- добавить кавычки вокруг
*.mydomain01.com
поэтому оболочка не интерпретирует *
aws acm request-certificate --domain-name mydomain01.com --validation-method DNS \
--subject-alternative-names '*.mydomain01.com'
{
"CertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab"
}
123456789012
мой идентификатор аккаунта AWS; все после сертификат/
это просто UUID
получить детали сертификата
- АМС АСМ
описание-сертификат
документы
- сохранить ответ во временный локальный файл; извлекать
РесурсРекорд.Имя
и РесурсРекорд.Значение
с использованием jq
- требуется для записи AWS Route 53, подтверждающей, что я владею
мойдомен01.com
- в качестве альтернативы используйте
--запрос
параметр с aws acm описание-сертификат
aws acm описание-сертификат \
--certificate-arn "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab" \
> описать-certificate.json
jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Name' description-certificate.json
_1234567890abcdef1234567890abcdef.mydomain01.com.
jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Value' description-certificate.json
_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws.
создать запись Route 53 для проверки сертификата
- будет автоматически проверен AWS ACM, и сертификат будет проверен, как только эта запись будет найдена.
- как и раньше, используйте временный локальный файл
изменение-batch.cert.json
, см., например. создать запись для домена вершины; содержание:
{
"Изменения": [
{
"Действие": "СОЗДАТЬ",
"ResourceRecordSet": {
"Имя": "_1234567890abcdef1234567890abcdef.mydomain01.com.",
"Тип": "CNAME",
«ТТЛ»: 300,
«Ресурсные записи»: [
{
«Значение»: «_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws».
}
]
}
}
]
}
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
--change-batch "файл://$(pwd)/change-batch.cert.json
- ответ аналогичный при создании записей выше
- ПРИМЕЧАНИЕ. Проверка сертификата ACM может занять несколько минут.
создать дистрибутив CloudFront
- AWS CloudFront
создание-распределение
документы
- еще раз,
CallerReference
должна быть просто уникальной строкой; использовать напр. дата '+%Y%m%d-%H%M%S'
в оболочке для создания и копирования в файл; видеть создать размещенную зону
- как и раньше, используйте временный локальный файл
создать-distribution.json
для сложных значений; содержание ниже
Минимальная версия протокола
: получить значение из эта статья AWS
OriginProtocolPolicy
: с использованием только для http
потому что источник (сегмент S3) может делать только http
ViewerProtocolPolicy
: с использованием перенаправление на https
так как весь смысл создания этого дистрибутива заключается в перенаправлении с http
к https
- ПРИМЕЧАНИЕ. Я не знаю (и документы AWS не говорят), какие поля обязательны для заполнения; команда AWS CLI отображает четкое и подробное сообщение, если что-то в отправленных данных отсутствует или неверно.
{
"CallerReference": "20210802-191725",
"Псевдонимы": {
«Количество»: 2,
"Элементы": ["mydomain01.com", "*.mydomain01.com"]
},
«Происхождение»: {
«Количество»: 1,
"Предметы": [
{
«Идентификатор»: «mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725»,
"DomainName": "mydomain01.com.s3.us-east-1.amazonaws.com",
"Кастоморигинконфиг": {
«HTTP-порт»: 80,
"HTTPSПорт": 443,
"OriginProtocolPolicy": "только для http"
}
}
]
},
"Исходные группы": {
"Количество": 0
},
"DefaultCacheBehavior": {
"TargetOriginId": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
"Перенаправленные значения": {
"СтрокаЗапроса": ложь,
"Печенье": {
«Вперед»: «нет»
},
«Заголовки»: {
"Количество": 0
},
"QueryStringCacheKeys": {
"Количество": 0
}
},
"Доверенные подписи": {
«Включено»: ложь,
"Количество": 0
},
"ViewerProtocolPolicy": "перенаправление на https",
"МинТТЛ": 0,
"Разрешенные методы": {
«Количество»: 2,
"Предметы": [
"ГЛАВНЫЙ",
"ПОЛУЧАТЬ"
],
"Кэшированные методы": {
«Количество»: 2,
"Предметы": [
"ГЛАВНЫЙ",
"ПОЛУЧАТЬ"
]
}
},
"SmoothStreaming": ложь,
"DefaultTTL": 86400,
"МаксТТЛ": 31536000,
"Сжать": ложь,
«Ассоциации ЛямбдаФункции»: {
"Количество": 0
},
"FieldLevelEncryptionId": ""
},
«Поведение кеша»: {
"Количество": 0
},
"Ответы об ошибках": {
"Количество": 0
},
"Комментарий": "",
"Логирование": {
«Включено»: ложь,
«IncludeCookies»: ложь,
"Ведро": "",
"Префикс": ""
},
"Ценовой класс": "Ценовой класс_Все",
«Включено»: правда,
"Сертификат просмотра": {
"ACMCertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab",
«Минимальная версия протокола»: «TLSv1.2_2021»,
"SSLSupportMethod": "только сни"
},
"Ограничения": {
"ГеоОграничение": {
«Тип ограничения»: «нет»,
"Количество": 0
}
},
"ВебАКЛИд": "",
"HttpVersion": "http2",
"IsIPV6Enabled": правда
}
- команда оболочки:
- ПРИМЕЧАНИЕ: добавить
--no-cli-пейджер
отключить подкачку и сохранить ответ во временном локальном файле для проверки
aws --no-cli-pager облачный дистрибутив для создания дистрибутива \
--distribution-config "файл://$(pwd)/create-distribution.json"
> создать-distribution.response.json
- ответ: большая структура JSON, в основном конфигурация, отправленная с некоторой метаинформацией о распространении
Попался: Развертывание дистрибутива CloudFront занимает некоторое время.
в Распределения обзор, есть Последнее изменение поле, которое говорит Развертывание некоторое время после каждого изменения; в зависимости от ширины экрана и окна браузера это поле может быть скрыто, поэтому пользовательский интерфейс может выглядеть так, как будто дистрибутив запущен и работает, хотя на самом деле это не так.
тестовая раздача
- получать
Доменное имя
из ответа
jq -r '.Distribution.DomainName' create-distribution.response.json
abcdefghij1234.cloudfront.net
http://abcdefghij1234.cloudfront.net
HTTP/1.1 301 перемещен навсегда
Соединение: Keep-alive
Длина контента: 183
Тип содержимого: текст/html
Дата: пн, 02 августа 2021 г., 20:14:27 по Гринвичу
Местоположение: https://abcdefghij1234.cloudfront.net/
Сервер: CloudFront
Через: 1.1 8640a37b586353bc916562c577770223.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ooT0Y1QvDE7_yoRmb0p0Un2Db6O713rBvudtmz1xer7YwEU0GE8smw==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: перенаправление из облака
<html>
<head><title>301 перемещен навсегда</title></head>
<тело bgcolor="белый">
<center><h1>301 перемещен навсегда</h1></center>
<hr><center>CloudFront</center>
</тело>
</html>
Таким образом, раздача перенаправляется с http://abcdefghij1234.cloudfront.net
к https://abcdefghij1234.cloudfront.net
- как это должно; это то, для чего он был создан.
HTTP/1.1 403 Запрещено
Соединение: Keep-alive
Тип содержимого: приложение/xml
Дата: пн, 02 августа 2021 г., 20:14:35 по Гринвичу
Сервер: AmazonS3
Передача-кодирование: по частям
Через: 1.1 c3e656776c8a9f0e1ea24405ab1dcc85.cloudfront.net (CloudFront)
X-Amz-Cf-Id: or4SC8urWEv_8c3jDURv5IINwFU1TDVLSQ3_X7tya7Ncz8ujyz0-IQ==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: ошибка из облачного фронта
x-amz-bucket-region: сша-восток-1
<?xml версия="1.0" кодировка="UTF-8"?>
<Ошибка>
<Code>Отказано в доступе</Code>
<Message>Отказано в доступе</Message>
<RequestId>EAST1CM5WJR8QM3S</RequestId>
<HostId>zF2dJm2vsuSM633NHuzcA5VqrCrNkfYGu31FRmKKIkebuI5+6l5DlVnr4kk9be262hcqktoiROw=</HostId>
</Ошибка>
- (xml отформатирован для удобочитаемости)
Это не выглядит хорошо. Не уверен, что этого следует ожидать?!?
Обновите записи AWS Route 53
- перейти от использования корзины S3 к использованию дистрибутива CloudFront
- как и прежде, создайте временный локальный файл
изменение-batch.apex.updatejson
к сед
в предыдущем файле изменение-batch.apex.json
- использовать
UPSERT
вместо СОЗДАЙТЕ
: запись уже существует и должна быть обновлена.
HostedZoneId
: заменить старое значение Z3AQBSTGFYJSTF
(для S3) Z2FDTNDATAQYW2
, некоторое магическое значение, взятое из наборы записей-изменений-ресурсов
документы
DNSName
: цитата из наборы записей-изменений-ресурсов
документы
Укажите доменное имя, назначенное CloudFront при создании дистрибутива.
Ваша раздача CloudFront должна включать альтернативное доменное имя, совпадающее с именем набора записей ресурсов. Например, если имя набора записей ресурсов — acme.example.com, ваша раздача CloudFront должна включать acme.example.com в качестве одного из альтернативных доменных имен.
--> заменить s3-веб-сайт-нас-восток-1.amazonaws.com
(для S3) abcdefghij1234.cloudfront.net
:
sed -e 's|СОЗДАТЬ|UPSERT|g' \
-e 's|Z3AQBSTGFYJSTF|Z2FDTNDATAQYW2|g' \
-e 's|s3-website-us-east-1.amazonaws.com|abcdefghij1234.cloudfront.net|g' \
пакетное изменение.apex.json > пакетное изменение.apex.update.json
{
"Изменения": [
{
«Действие»: «UPSERT»,
"ResourceRecordSet": {
"Имя": "mydomain01.com.",
"Наберите "А",
«Псевдоним»: {
"Хостедзонеид": "Z2FDTNDATAQYW2",
"DNSName": "abcdefghij1234.cloudfront.net",
«EvaluateTargetHealth»: ложь
}
}
}
]
}
aws route53 наборы записей изменений-ресурсов \
--hosted-zone-id Z123456789EXAMPLE0SKX \
--change-batch "файл://$(pwd)/change-batch.apex.update.json"
- ответ аналогичный при создании записей выше
тестовая запись домена apex
http://mydomain01.com
HTTP/1.1 301 перемещен навсегда
Соединение: Keep-alive
Длина контента: 183
Тип содержимого: текст/html
Дата: пн, 02 августа 2021 г., 19:08:27 по Гринвичу
Адрес: https://mydomain01.com/
Сервер: CloudFront
Через: 1.1 2408979685aa1bdb752824d292e63bf7.cloudfront.net (CloudFront)
X-Amz-Cf-Id: Ww60Ol_0fdR8SsgcHeRYUd_de1rVejX6w_wuK80aR21e3IHstB-irA==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: перенаправление из облака
<html>
<head><title>301 перемещен навсегда</title></head>
<тело bgcolor="белый">
<center><h1>301 перемещен навсегда</h1></center>
<hr><center>CloudFront</center>
</тело>
</html>
- ответ теперь приходит от CloudFront, а не от S3, поэтому обновленная запись DNS, похоже, работает :-)
- тестовое задание
http
с дорожкой
http://mydomain01.com/some/путь
... аналогичный вывод, как указано выше ...
--> хорошо выглядит
http https://mydomain01.com
HTTP/1.1 403 Запрещено
Соединение: Keep-alive
Тип содержимого: приложение/xml
Дата: пн, 02 августа 2021 г., 18:53:51 по Гринвичу
Сервер: AmazonS3
Передача-кодирование: по частям
Через: 1.1 ea89c67081222c8c680e7a37ad75f4f0.cloudfront.net (CloudFront)
X-Amz-Cf-Id: 5prv5_g5zXOX3aRBp2Gq64JJPuwC2o5dHIp9RCAHm6Ls8hK6EFghXw==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: ошибка из облачного фронта
x-amz-bucket-region: сша-восток-1
<?xml версия="1.0" кодировка="UTF-8"?>
<Ошибка>
<Code>Отказано в доступе</Code>
<Message>Отказано в доступе</Message>
<RequestId>T78ASF3FA9QGV4T5</RequestId>
<HostId>xaEgwEtbeesL4XfxMdxVoPAt9Lpb1ZDM9Fs5W4htBbcWNbV9sMUTjVAPIuWwAQ3Xh1yRhh4b4Ts=</HostId>
</Ошибка>
- (как и раньше, xml отформатирован для удобства чтения)
ПРИМЕЧАНИЕ. Этот ответ исходит от АмазонС3
, не из CloudFront
как предыдущий. Корзина S3 не имеет никаких ограничений доступа — так как же может быть доступ закрыт ?!?
дважды проверьте права доступа к корзине
aws s3api get-bucket-policy --bucket mydomain01.com
Произошла ошибка (NoSuchBucketPolicy) при вызове операции GetBucketPolicy: политика корзины не существует.
Это соответствует пустому Политика корзины поле в Консоли AWS S3 - но разве это нормально, что политики ведра вообще нет?!?
Теперь, когда оглядываешься назад тестовая раздача выше я вижу, что ответ на доступ abcdefghij1234.cloudfront.net
напрямую также поступают из S3, а не из CloudFront, поэтому проблема кажется довольно ясной:
Мои вопросы №2
- Почему корзина S3 запрещает доступ?
- Нормально ли, что корзина S3 вообще не имеет политики доступа? Обычно у «общедоступных» корзин нет политики, которая явно разрешает доступ всем?
- Похожий на одно ведро S3 на вершину/поддомен, нужна ли мне также одна база раздачи CloudFront для каждого домена вершины/субдомена?
- Если это так, я думаю, добавить
*.mydomain01.com
поскольку альтернативный домен сертификату (и раздаче) не имеет особого смысла, не так ли?!? Мне также понадобится один сертификат для каждого дистрибутива, предназначенный для одного домена, верно?