Рейтинг:4

AWS: как перенаправить множество доменов на страницу в другом домене?

флаг us
ssc

Моя цель

У меня есть несколько доменов (например, 10 или 20), и я хочу перенаправить Любые посетители везде на этих страницах на одну страницу в другом домене (например, на моей странице профиля stackoverflow.com).

Это включает в себя

  1. вершинный домен с использованием http (например. http://mydomain01.com)
  2. вершинный домен с использованием https (например. https://mydomain01.com)
  3. поддомены с использованием http (например. http://www.mydomain01.com или же http://blog.mydomain01.com)
  4. поддомены с использованием https (например. https://www.mydomain01.com или же https://blog.mydomain01.com)
  5. любые пути (напр. http://mydomain01.com/some_path или же https://www.mydomain01.com/another/path.html)

плюс то же самое для всех моих других доменов (мойдомен02.com, мойдомен03.com, и т.д.; каждый с вышеуказанными вариантами использования).

Мое исследование

  1. Эта статья об AWS объясняет, как перенаправить интернет-трафик с домена вершины на другой домен (случай № 1 в моем Это включает в себя список выше) используя АВС S3 и Маршрут AWS 53: Это работает для http, но не для https.
  2. Эта статья об AWS объясняет, как перенаправить интернет-трафик для ряда случаев (судя по всему, охватывает все случаи в моем Это включает в себя список выше) используя АВС S3, Маршрут AWS 53 и AWS CloudFront: Это работает для обоих http и https. (Также говорится об использовании балансировщика нагрузки приложений, но я думаю, что это выходит за рамки здесь...)
  3. Эта статья об AWS добавляет некоторые дополнительные сведения о настройке базы раздачи CloudFront и о том, как получить представление о файлах журналов.
  4. Эта статья об AWS правила перенаправления документов для использования расширенных условных перенаправлений: не уверен, нужно ли мне идти туда для достижения моей цели, поэтому еще не изучал это.

Плюс, очевидно, есть много вопросов SO (см. Связанный справа от этого вопроса) и другие посты по теме; проблема с большинством из них заключается в том, что они используют снимки экрана из предыдущих версий пользовательского интерфейса консоли AWS: большая часть содержимого должна оставаться прежней, но сопоставление этих снимков экрана с текущим пользовательским интерфейсом IMO добавляет еще один уровень путаницы.

Основные выводы из документов AWS (и других):

  1. Мне нужно создать ведро в AWS S3 и настроить в нем перенаправление,
  2. Мне нужно создать дистрибутив в AWS CloudFront;
  3. чтобы использовать собственный домен в CloudFront, мне нужно создать сертификат в AWS ACM,
  4. Мне нужно создать размещенную зону в 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 просто говорит

  1. Создайте корзину 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 запись поддомена ниже). Кто-нибудь, поправьте меня, если я ошибаюсь:

  1. Вопрос: Применяется ли требование «имя корзины == имя домена», даже если я использую CloudFront?
    А: Да.
  2. Вопрос: Нужно ли мне создавать по одному сегменту для домена вершины и каждого поддомена? так, в моем примере
    • мойдомен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
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/путь
 ... аналогичный вывод, как указано выше ...
  • тестовое задание https
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
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
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 - как это должно; это то, для чего он был создан.

  • тестовое задание https
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
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/путь
 ... аналогичный вывод, как указано выше ...

--> хорошо выглядит

  • тестовое задание https
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

  1. Почему корзина S3 запрещает доступ?
  2. Нормально ли, что корзина S3 вообще не имеет политики доступа? Обычно у «общедоступных» корзин нет политики, которая явно разрешает доступ всем?
  3. Похожий на одно ведро S3 на вершину/поддомен, нужна ли мне также одна база раздачи CloudFront для каждого домена вершины/субдомена?
  4. Если это так, я думаю, добавить *.mydomain01.com поскольку альтернативный домен сертификату (и раздаче) не имеет особого смысла, не так ли?!? Мне также понадобится один сертификат для каждого дистрибутива, предназначенный для одного домена, верно?
Marcin avatar
флаг es
Ваша корзина должна быть либо общедоступной, либо вам нужно использовать пользователя OAI для доступа к CF.
Рейтинг:1
флаг mx

Вы на правильном пути в целом. Всего один комментарий: Route53 можно не указывать, если ваш домен уже использует другого поставщика услуг DNS.

Вопрос. Применяется ли требование «имя корзины == имя домена», даже если я использую CloudFront?

Нет, если вы используете CloudFront. CNAME настраивается отдельно в CloudFront.

Вопрос. Нужно ли создавать по одному сегменту для домена вершины и каждого субдомена?

Нет, вам не нужно одно ведро для каждого домена/субдомена.

Почему корзина S3 запрещает доступ?

Вы должны использовать свой s3-веб-сайт-нас-восток-1.amazonaws.com домен в качестве источника CF.

Нормально ли, что корзина S3 вообще не имеет политики доступа? Обычно у «общедоступных» корзин нет политики, которая явно разрешает доступ всем?

Если вы используете корзину только для перенаправления трафика, никакая политика доступа не подойдет.

Аналогично одной корзине S3 на апекс/субдомен, нужна ли мне одна раздача CloudFront на апекс/субдомен?

Да, вам нужен один дистрибутив CloudFront для каждого домена/субдомена, потому что к одному дистрибутиву можно прикрепить не более одного сертификата ACM.

Если это так, я думаю, добавить *.mydomain01.com поскольку альтернативный домен сертификату (и раздаче) не имеет особого смысла, не так ли?!? Мне также понадобится один сертификат для каждого дистрибутива, предназначенный для одного домена, верно?

Добавление подстановочного домена имеет смысл, поскольку дистрибутив CF также должен обрабатывать трафик поддоменов.

Если у вас есть дополнительные вопросы, присоединяйтесь к Чат AWS и @ меня в чате.

флаг ar
Обратите внимание, что пользовательский интерфейс консоли AWS автоматически рекомендует использовать формат «example.com.s3.us-east-1.amazonaws.com» вместо пользовательского формата «example.com.s3-website-us-east-1.amazonaws.com». в статье также говорится использовать: https://aws.amazon.com/premiumsupport/knowledge-center/route-53-redirect-to-another-domain/ > Запишите конечную точку корзины (example.com.s3-website-us-east-1.amazonaws.com). Вы будете использовать эту информацию для настройки имени исходного домена для CloudFront в следующей задаче.
jellycsc avatar
флаг mx
@Tony-Caffe Хороший звонок!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.