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

Моя цель

У меня есть несколько доменов (например, 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 )

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

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

  1. В этой статье AWS объясняется, как перенаправить интернет-трафик из верхнего домена в другой домен (случай №1 в моем , включая список выше) с помощью AWS S3 и AWS Route 53 : это работает для http , но не для https .
  2. В этой статье AWS объясняется, как перенаправить интернет-трафик для ряда случаев (судя по всему, охватывая все случаи в моем , включая список выше) с использованием AWS S3 , AWS Route 53 и AWS CloudFront : это работает как для http , так и https . (Также говорится об использовании Application Load Balancer, но я полагаю, что это выходит за рамки здесь ...)
  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 / credentials (каждый для каждой учетной записи AWS); AWS _ * переменные среды - это экспорт изд.

Я использую регион AWS Восток США (Северная Вирджиния) (us-east-1) для всего, чтобы предотвратить любые дополнительные проблемы, вызванные недоступностью ресурсов AWS в регионе.

$ aws --version
aws-cli/2.2.23 Python/3.9.6 Darwin/19.6.0 source/x86_64 prompt/off

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

Настройка корзины S3

Предупреждение: Это создает «общедоступную» корзину без каких-либо ограничений доступа.В этом случае это не должно иметь значения, поскольку нет содержимого корзины, которое нужно защищать, но такая общедоступная корзина в целом является плохой практикой. Кроме того, я использую публичную корзину, чтобы предотвратить любые дополнительные проблемы, вызванные ограничениями доступа: Во-первых, заставьте ее работать; во-вторых, сделайте его безопасным .

создать корзину

aws s3api create-bucket --bucket mydomain01.com
  • ответ:
{
    "Location": "/mydomain01.com"
}

настроить перенаправление

aws s3api put-bucket-website --bucket mydomain01.com --website-configuration \
    '{ "RedirectAllRequestsTo": { "HostName": "stackoverflow.com/users/217844/ssc" } }'
  • нет ответа

Попался: Имя сегмента S3 должно совпадать с именем домена вершины.

Использование любого имени корзины, кроме mydomain01.com (для моего примера), кажется, не работает без указания причины. В документах AWS это не очень ясно - на самом деле, я все еще не уверен, что я что-то неправильно понимаю здесь, но, насколько я могу судить, официальная документация AWS на самом деле несколько небрежна по этому поводу - ИМО - важный ключевой момент : Например, # 2 просто говорит

  1. Создать корзину S3 с глобальным уникальным именем.

, которое может быть любым глобально уникальным именем. # 1 упоминает это каким-то образом - если вы знаете, как читать эти биты ...

Кстати, эта статья # 2 продолжает сбивать меня с толку с

Если вы не с использованием личного домена ...

Почему бы мне не использовать личный домен?!? Все дело в перенаправлении моего личного домена, не так ли?!? Ну, в любом случае ...

Попался: Нельзя добавлять протокол к имени хоста.

Ни консоль AWS, ни интерфейс командной строки AWS, похоже, не проверяют, был ли протокол ( http: // или https: // ) введен в Имя хоста Поле пользовательского интерфейса / передается в строке JSON HostName . Однако, если он добавлен, перенаправление не выполняется; см. тестовое перенаправление ниже.

Попался: Ошибка пользовательского интерфейса консоли AWS S3.

После настройки перенаправления консоль AWS отображает интерактивную ссылку в своем пользовательском интерфейсе на URL-адрес корзины ( http://mydomain01.com.s3-website-us-east-1.amazonaws.com ) в самом низу корзины Свойства в разделе Статический хостинг веб-сайтов .

При нажатии на эту ссылку страница не открывается, по-видимому, потому, что Консоль AWS искажает URL-адрес и пытается открыть http: //https//stackoverflow.com/users/217844/ssc/ , нет имеет значение протокол.

тестовое перенаправление

  • с использованием HTTPie в оболочке вместо curl или wget , потому что это то, что крутые ребята, похоже, используют в настоящее время
  • копировать ссылка из Консоли AWS в браузере на оболочку
http http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Mon, 02 Aug 2021 12:39:09 GMT
Location: http://stackoverflow.com/users/217844/ssc/
Server: AmazonS3
x-amz-id-2: rakAqUMnRraGvo/WkSa6AnbuhWn/9YZX/CAlI/OJQKYoWp/OdQIbyhsvHSwNved3suwMdgglqpE=
x-amz-request-id: C5BBG833Q9TQ9J6X

-> кажется, работает

  • проверить перенаправление, если протокол был ошибочно добавлен к имени хоста; обратите внимание на сломанный Местоположение url:
http http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Mon, 02 Aug 2021 12:52:10 GMT
Location: http://https://stackoverflow.com/users/217844/ssc/
Server: AmazonS3
x-amz-id-2: Ee2/ob0faTpRdp6mGITdmClozXNmF1Q2oTbPioms8O91VA8n5VA3MoHhveeFz7v2VS65YKFKlDA=
x-amz-request-id: ZJP653R50YD5HSRS

Мои вопросы # 1

ПРИМЕЧАНИЕ: у меня были эти вопросы, когда я только начинал писать это; Я думаю , что смог ответить на них сам с тех пор (см. test www запись субдомена ниже). Кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь:

  1. Q: Применяется ли требование «bucket name == domain name», даже если я использую CloudFront?
    A: Да.
  2. Q: Нужно ли мне создавать по одной корзине для каждого домена вершины и каждого поддомена? Итак, в моем примере
    • mydomain01.com
    • www.mydomain01.com
    • blog.mydomain01.com ?
      A: Да.

Настройка зоны хостинга Route 53

создание зоны хостинга

aws route53 create-hosted-zone --caller-reference "$(date '+%Y%m%d-%H%M%S')" --name mydomain01.com
  • ответ
{
    "Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z123456789EXAMPLE0SKX",
    "HostedZone": {
        "Id": "/hostedzone/Z123456789EXAMPLE0SKX",
        "Name": "mydomain01.com.",
        "CallerReference": "20210802-150736",
        "Config": {
            "PrivateZone": false
        },
        "ResourceRecordSetCount": 2
    },
    "ChangeInfo": {
        "Id": "/change/C1234567890SKXEXAMPLE",
        "Status": "PENDING",
        "SubmittedAt": "2021-08-02T13:07:37.860000+00:00"
    },
    "DelegationSet": {
        "NameServers": [
            "ns-1234.awsdns-12.com",
            "ns-5678.awsdns-34.co.uk",
            "ns-1234.awsdns-56.net",
            "ns-5678.awsdns-78.org"
        ]
    }
}
  • обратите внимание на идентификатор размещенной зоны Z123456789EXAMPLE0SKX , необходимо на следующих шагах

создать запись для верхнего домена

  • AWS Route 53 change-resource- record-sets docs
  • это должно работать для http , но не для https
  • , JSON для передачи несколько сложен; создать локальный временный файл change-batch.apex.json с приведенным ниже содержимым
  • получить значения для HostedZoneId и DNSName с веб-сайта Amazon S3 конечные точки : сегмент был создан в Востоке США (Северная Вирджиния) , поэтому используйте Z3AQBSTGFYJSTF
{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "mydomain01.com.",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "Z3AQBSTGFYJSTF",
          "DNSName": "s3-website-us-east-1.amazonaws.com",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}

Попался: Необходимо использовать дословно s3-website-us-east -1.amazonaws.com для DNSName .

Документы AWS говорят о example.com или example.com.s3-website-us-east-1.amazonaws.com и т. Д. случае, это не какой-то пример, который нужно заменить собственными значениями (например, mydomain01.com.s3-website-us-east-1.amazonaws.com ), а дословное значение из таблица , то есть s3-website-us-east-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 "file://$(pwd)/change-batch.apex.json"
  • ответ
{
    "ChangeInfo": {
        "Id": "/change/C1234567890EXAMPLESKX",
        "Status": "PENDING",
        "SubmittedAt": "2021-08-02T14:20:09.370000+00:00"
    }
}

тестовая запись домена вершины

  • тест http
http http://mydomain01.com
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Mon, 02 Aug 2021 15:06:08 GMT
Location: http://stackoverflow.com/users/217844/ssc/
Server: AmazonS3
x-amz-id-2: EfDtCxif2iV4eInskirSBAOjQS7o9arzJCeZjscF6mW7cwwmm9Nxb7QJT50x2kjdslX2fOxA+lk=
x-amz-request-id: WM7K9TDEF75A6P1V

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

  • test http с путем
http http://mydomain01.com/some/path
 ... similar output as above ...
  • test https
http https://mydomain01.com

http: error: ConnectionError: HTTPSConnectionPool(host='mydomain01.com', port=443):
  Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x101a48100>:
    Failed to establish a new connection: [Errno 60] Operation timed out')) while doing a GET request to URL: https://mydomain01.com/
  • (ответ упакован для удобочитаемости)

-> истекает время ожидания (через 60 с ?) - как и ожидалось: перенаправление с использованием сегмента S3 не работает с https (см. выше)

Попался: Задержка распространения изменения DNS.

AWS и Google очень быстро распространяют изменения в настройках DNS (в секундах или минутах), но могут быть задействованы и другие, «более медленные» серверы имен. Обходите их, как описано здесь , чтобы устранить этот источник путаницы. Этот подход работает только в macOS, но концепция одинакова для любой ОС.

Попался: Кеш браузера.

При тестировании изменений DNS не в оболочке, а в браузере, браузер может получать результаты из своего кеша. Я выполняю большую часть своей работы с помощью Chrome, но использую Firefox (или Safari) для тестирования, поэтому я могу очищать весь кеш перед каждым тестом, чтобы устранить эту потенциальную проблему - без выхода из Google, AWS и т. Д.

создать запись для поддомена www

  • , единственное отличие - это ответ Name JSON value
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 "file://$(pwd)/change-batch.www.json
  • , аналогичный приведенному выше

test www запись поддомена

  • test http
http http://www.mydomain01.com
HTTP/1.1 404 Not Found
Content-Length: 363
Content-Type: text/html; charset=utf-8
Date: Mon, 02 Aug 2021 15:28:05 GMT
Server: AmazonS3
x-amz-id-2: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=
x-amz-request-id: TK83G35EMYFR8SKX

<html>
<head><title>404 Not Found</title></head>
<body>
<h1>404 Not Found</h1>
<ul>
<li>Code: NoSuchBucket</li>
<li>Message: The specified bucket does not exist</li>
<li>BucketName: www.mydomain01.com</li>
<li>RequestId: TK83G35EMYFR8SKX</li>
<li>HostId: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=</li>
</ul>
<hr/>
</body>
</html>
  • Я думаю, что это отвечает на второй из моих вопросов №1 выше: Мне нужно одно ведро S3 на вершину / поддомен для пересылки.

Настройка распространения CloudFront

создать сертификат

  • AWS ACM запрос-сертификат docs
  • сертификат должен работать для вершины и всех поддоменов, поэтому необходимо добавить другое имя к этому сертификату / pass - альтернативные имена субъектов ; см. эту статью 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

получить сведения о сертификате

  • AWS ACM описать-сертификат документы
  • сохранить ответ во временный локальный файл; извлеките ResourceRecord.Name и ResourceRecord.Value , используя jq
  • , необходимый для записи AWS Route 53, которая доказывает, что я владею mydomain01.com
  • в качестве альтернативы используйте - параметр запроса с aws acm description-certificate
aws acm describe-certificate \
    --certificate-arn "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab" \
 > describe-certificate.json
jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Name' describe-certificate.json
_1234567890abcdef1234567890abcdef.mydomain01.com.

jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Value' describe-certificate.json 
_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws.

создайте запись Route 53 для проверки сертификата

  • будет автоматически проверяться AWS ACM, и сертификат будет проверяться, как только эта запись будет найдена
  • , как и раньше, используйте временный локальный файл change-batch.cert.json , см., например, создать запись для верхнего домена ; содержимое:
{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "_1234567890abcdef1234567890abcdef.mydomain01.com.",
        "Type": "CNAME",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws."
          }
        ]
      }
    }
  ]
}
  • команда оболочки:
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.cert.json
  • ответ аналогичен тому, как при создании записей выше
  • ПРИМЕЧАНИЕ. ACM может потребоваться несколько минут для проверки сертификата.

создать дистрибутив CloudFront

  • AWS CloudFront создать-распространение документы
  • снова, CallerReference должна быть просто уникальной строкой; использовать, например, date '+% Y% m% d-% H% M% S' в оболочке для создания и копирования в файл; см. создайте размещенную зону
  • , как и раньше, используйте временный локальный файл create-distribution.json для комплексных значений; содержимое ниже
  • MinimumProtocolVersion : получить значение из этой статьи AWS
  • OriginProtocolPolicy : использовать http-only , потому что источник (корзина S3) может выполнять только ] http
  • ViewerProtocolPolicy : использование redirect-to-https , поскольку весь смысл создания этого распределения заключается в перенаправлении с http на https
  • ПРИМЕЧАНИЕ : Я не знаю (и документация AWS не сообщает), какие поля обязательны для заполнения; команда AWS CLI отображает четкое и подробное сообщение, если что-то в отправленных данных отсутствует или неверно.
{
    "CallerReference": "20210802-191725",
    "Aliases": {
        "Quantity": 2,
        "Items": ["mydomain01.com", "*.mydomain01.com"]
    },
    "Origins": {
        "Quantity": 1,
        "Items": [
            {
                "Id": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
                "DomainName": "mydomain01.com.s3.us-east-1.amazonaws.com",
                "CustomOriginConfig": {
                    "HTTPPort": 80,
                    "HTTPSPort": 443,
                    "OriginProtocolPolicy": "http-only"
                }
            }
        ]
    },
    "OriginGroups": {
        "Quantity": 0
    },
    "DefaultCacheBehavior": {
        "TargetOriginId": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
        "ForwardedValues": {
            "QueryString": false,
            "Cookies": {
                "Forward": "none"
            },
            "Headers": {
                "Quantity": 0
            },
            "QueryStringCacheKeys": {
                "Quantity": 0
            }
        },
        "TrustedSigners": {
            "Enabled": false,
            "Quantity": 0
        },
        "ViewerProtocolPolicy": "redirect-to-https",
        "MinTTL": 0,
        "AllowedMethods": {
            "Quantity": 2,
            "Items": [
                "HEAD",
                "GET"
            ],
            "CachedMethods": {
                "Quantity": 2,
                "Items": [
                    "HEAD",
                    "GET"
                ]
            }
        },
        "SmoothStreaming": false,
        "DefaultTTL": 86400,
        "MaxTTL": 31536000,
        "Compress": false,
        "LambdaFunctionAssociations": {
            "Quantity": 0
        },
        "FieldLevelEncryptionId": ""
    },
    "CacheBehaviors": {
        "Quantity": 0
    },
    "CustomErrorResponses": {
        "Quantity": 0
    },
    "Comment": "",
    "Logging": {
        "Enabled": false,
        "IncludeCookies": false,
        "Bucket": "",
        "Prefix": ""
    },
    "PriceClass": "PriceClass_All",
    "Enabled": true,
    "ViewerCertificate": {
        "ACMCertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab",
        "MinimumProtocolVersion": "TLSv1.2_2021",
        "SSLSupportMethod": "sni-only"
    },
    "Restrictions": {
        "GeoRestriction": {
            "RestrictionType": "none",
            "Quantity": 0
        }
    },
    "WebACLId": "",
    "HttpVersion": "http2",
    "IsIPV6Enabled": true
}
  • команда оболочки:
  • ПРИМЕЧАНИЕ: добавьте - no-cli-pager , чтобы отключить разбиение на страницы и сохранить ответ во временном локальном файле для проверки.
aws --no-cli-pager cloudfront create-distribution \
    --distribution-config "file://$(pwd)/create-distribution.json"
 > create-distribution.response.json
  • ответ: большая структура JSON, в основном конфигурация отправлено с некоторой метаинформацией о распространении

Попался: Распространение CloudFront требует времени для развертывания.

В обзоре Распределения есть поле Последнее изменение , в котором указано Развертывание на некоторое время после каждого изменения; в зависимости от экрана и ширины окна браузера это поле может быть скрыто, поэтому пользовательский интерфейс может выглядеть так, как будто дистрибутив запущен и работает, хотя на самом деле это не так.

тестовый дистрибутив

  • получить DomainName из ответа
jq -r '.Distribution.DomainName' create-distribution.response.json
abcdefghij1234.cloudfront.net
  • test http
http http://abcdefghij1234.cloudfront.net
HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Content-Length: 183
Content-Type: text/html
Date: Mon, 02 Aug 2021 20:14:27 GMT
Location: https://abcdefghij1234.cloudfront.net/
Server: CloudFront
Via: 1.1 8640a37b586353bc916562c577770223.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ooT0Y1QvDE7_yoRmb0p0Un2Db6O713rBvudtmz1xer7YwEU0GE8smw==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Redirect from cloudfront

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>

Таким образом, дистрибутив перенаправляется с http://abcdefghij1234.cloudfront.net на https://abcdefghij1234.cloudfront.net - как надо; вот для чего он был создан.

  • test https
HTTP/1.1 403 Forbidden
Connection: keep-alive
Content-Type: application/xml
Date: Mon, 02 Aug 2021 20:14:35 GMT
Server: AmazonS3
Transfer-Encoding: chunked
Via: 1.1 c3e656776c8a9f0e1ea24405ab1dcc85.cloudfront.net (CloudFront)
X-Amz-Cf-Id: or4SC8urWEv_8c3jDURv5IINwFU1TDVLSQ3_X7tya7Ncz8ujyz0-IQ==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Error from cloudfront
x-amz-bucket-region: us-east-1

<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
  <RequestId>EAST1CM5WJR8QM3S</RequestId>
  <HostId>zF2dJm2vsuSM633NHuzcA5VqrCrNkfYGu31FRmKKIkebuI5+6l5DlVnr4kk9be262hcqktoiROw=</HostId>
</Error>
  • (XML отформатирован для удобства чтения)

Это не очень хорошо. Не уверен, что этого следует ожидать?!?

Обновите записи AWS Route 53

  • , переход от использования корзины S3 к использованию распределения CloudFront
  • , как и раньше, создайте временный локальный файл change- batch.apex.updatejson от sed В более раннем файле change-batch.apex.json
  • используйте UPSERT вместо CREATE : Запись уже существует и должна быть обновлена.
  • HostedZoneId : заменить старое значение Z3AQBSTGFYJSTF (для S3) на Z2FDTNDATAQYW2 , некое магическое значение, взятое из change-resource-record-sets
  • DNSName : цитата из change-resource-record-sets docs

Укажите имя домена, присвоенное CloudFront при создании вашего дистрибутива.

Ваш дистрибутив CloudFront должен включать альтернативное доменное имя, которое соответствует имени набора записей ресурсов. Например, если имя набора записей ресурсов - acme.example.com, ваш дистрибутив CloudFront должен включать acme.example.com в качестве одного из альтернативных доменных имен.

-> заменить s3-website-us-east-1.amazonaws.com (для S3) на abcdefghij1234.cloudfront.net :

sed -e 's|CREATE|UPSERT|g' \
    -e 's|Z3AQBSTGFYJSTF|Z2FDTNDATAQYW2|g' \
    -e 's|s3-website-us-east-1.amazonaws.com|abcdefghij1234.cloudfront.net|g' \
    change-batch.apex.json > change-batch.apex.update.json
  • содержимое файла:
{
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "mydomain01.com.",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "Z2FDTNDATAQYW2",
          "DNSName": "abcdefghij1234.cloudfront.net",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}
  • команда оболочки
aws route53 change-resource-record-sets \
    --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.apex.update.json"
  • ответ аналогичен ответу при создании записей выше

test apex domain record

  • test http
http http://mydomain01.com
HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Content-Length: 183
Content-Type: text/html
Date: Mon, 02 Aug 2021 19:08:27 GMT
Location: https://mydomain01.com/
Server: CloudFront
Via: 1.1 2408979685aa1bdb752824d292e63bf7.cloudfront.net (CloudFront)
X-Amz-Cf-Id: Ww60Ol_0fdR8SsgcHeRYUd_de1rVejX6w_wuK80aR21e3IHstB-irA==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Redirect from cloudfront

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>
  • ответ теперь исходит от CloudFront, а не от S3, поэтому обновленная запись DNS кажется для работы: -)
  • test http с путем
http http://mydomain01.com/some/path
 ... similar output as above ...

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

  • test https
http https://mydomain01.com
HTTP/1.1 403 Forbidden
Connection: keep-alive
Content-Type: application/xml
Date: Mon, 02 Aug 2021 18:53:51 GMT
Server: AmazonS3
Transfer-Encoding: chunked
Via: 1.1 ea89c67081222c8c680e7a37ad75f4f0.cloudfront.net (CloudFront)
X-Amz-Cf-Id: 5prv5_g5zXOX3aRBp2Gq64JJPuwC2o5dHIp9RCAHm6Ls8hK6EFghXw==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Error from cloudfront
x-amz-bucket-region: us-east-1

<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
  <RequestId>T78ASF3FA9QGV4T5</RequestId>
  <HostId>xaEgwEtbeesL4XfxMdxVoPAt9Lpb1ZDM9Fs5W4htBbcWNbV9sMUTjVAPIuWwAQ3Xh1yRhh4b4Ts=</HostId>
</Error>
  • (как и раньше, xml отформатирован для удобства чтения)

ПРИМЕЧАНИЕ. Этот ответ поступает от AmazonS3 , а не от CloudFront , как предыдущий. Корзина S3 не имеет каких-либо ограничений доступа - так как же может быть доступ запрещен ?!?

перепроверьте разрешения корзины

aws s3api get-bucket-policy --bucket mydomain01.com

An error occurred (NoSuchBucketPolicy) when calling the GetBucketPolicy operation: The bucket policy does not exist

Это соответствует пустому полю Bucket policy в Консоли AWS S3 - но действительно ли нормально, что политики корзины вообще нет?!?

Теперь вернемся к тестовый дистрибутив выше, я вижу, что ответ на доступ к abcdefghij1234.cloudfront.net напрямую также поступает из S3, а не из CloudFront, поэтому проблема кажется довольно ясной:

Мои вопросы # 2

  1. Почему корзина S3 запрещает доступ?
  2. Это нормально для S3 ведро, чтобы вообще не было политики доступа? Обычно у меня нет «общедоступных» сегментов политики, которая явно разрешает доступ кому угодно?
  3. Подобно одна корзина S3 на вершину / поддомен , мне также нужно одно распределение CloudFront на вершину / поддомен ?
  4. Если это так, я полагаю, добавление *. Mydomain01.com в качестве альтернативного домена к сертификату (и распределению) на самом деле не имеет никакого смысла, не так ли?!? Мне также понадобится один сертификат для каждого дистрибутива, выделенный для одного домена, верно?
3
задан 2 August 2021 в 22:07
1 ответ

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

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

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

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

Нет, вам не нужно по одному сегменту на домен/субдомен.

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

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

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

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

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

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

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

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

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

1
ответ дан 2 August 2021 в 22:33

Теги

Похожие вопросы