Веб-сайт CloudFront + S3: указанный ключ не существует, если должен отображаться неявный индексный документ

Я только что развернул статический веб-сайт в Amazon S3, который в настоящее время можно просмотреть здесь: http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/

Если вы нажмете любую ссылку на статью, вы заметите следующую ошибку:

«Ошибка

S3 жалуется, что файл не существует. Вот что в этом странного - я использую CloudFront в своем домене. Поэтому, когда вы нажимаете ссылку на эту статью, он отправляет запрос в CloudFront, который затем пытается получить файл обратно из корзины S3.

Однако, если вы посещаете тот же URL-адрес напрямую из S3, например: http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/2015/building-a-heroku-addon-scheme/ страница загрузится нормально.

Похоже, здесь что-то теряется в переводе.

У кого-нибудь есть предложение, что я могу сделать, чтобы исправить свои настройки?


person rdegges    schedule 03.12.2015    source источник


Ответы (9)


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

У корзин S3 есть две конечные точки: «REST» и «веб-сайт». У них есть два разных набора функций. Конечная точка веб-сайта обеспечивает волшебное разрешение индексных документов (например, index.html, который, по-видимому, является тем, что на самом деле должно быть возвращено браузеру в приведенном вами примере), в то время как конечные точки REST - нет.

Когда вы настраиваете CloudFront перед корзиной, используемой для хостинга веб-сайтов, вы обычно не хотите настраивать источник как источник «S3», выбирая имя корзины из раскрывающегося списка; вместо этого вы хотите настроить его как «Пользовательский» источник и использовать имя хоста конечной точки веб-сайта, как указано в консоли S3 (например, example-bucket.s3-website-us-east-1...), потому что в противном случае CloudFront предполагает, что вы хотите, чтобы он использовал конечную точку REST для сегмента (что позволяет аутентификация и частный контент, чего нет на конечной точке веб-сайта).

Важно

Не выбирайте название своей корзины из списка, например, example.com.s3.amazonaws.com.

http://docs.aws.amazon.com/gettingstarted/latest/swh/getting-started-create-cfdist.html

После первоначального ответа на этот вопрос документация была переработана, поэтому сообщение, показанное выше, теперь появляется на одну страницу позже и было изменено, но суть осталась прежней. «Название корзины», кажется, относится к вариантам, показанным в раскрывающемся списке, а это не то, что вам нужно.

Примечание

Обязательно укажите конечную точку хостинга статического веб-сайта, а не имя сегмента.

http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-cloudfront-walkthrough.html

Подсказка о том, что вы используете конечную точку REST для корзины, заключается в том, что сообщение об ошибке не было бы в XML, если бы вы использовали конечную точку веб-сайта - конечная точка веб-сайта возвращает сообщения об ошибках в HTML, а не в XML.

Создайте новый источник для распространения CloudFront, как описано, затем измените поведение для отправки запросов в новый источник, затем отправьте запрос аннулирования кеша CloudFront для /*, и вы должны быть настроены.

Смотрите также:

http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html#WebsiteRestEndpointDiff


две конечные точки. Технически их больше двух, поскольку все сегменты имеют как минимум два возможных имени хоста конечной точки REST ... но есть два типа конечных точек. У корзин также есть дополнительная конечная точка ускорения передачи, которая использует граничную сеть AWS (ту же инфраструктуру, что и CloudFront) для более быстрой / оптимизированной передачи, особенно из географических местоположений, более удаленных от региона, где предоставляется корзина, но без использования кеша CloudFront. Эта конечная точка выглядит https://example-bucket.s3-accelerate.amazonaws.com, если вы ее активируете, и за нее взимается дополнительная плата за большинство запросов, поскольку вы используете большую часть сети AWS и меньше общедоступного Интернета ... развертывание конечной точки, а не поведение конечной точки. Конечная точка ускорения передачи по-прежнему является конечной точкой REST, поэтому, как и другие конечные точки REST, у нее нет функций хостинга веб-сайтов. CloudFront не позволит вам использовать конечную точку ускорения для исходного доменного имени, потому что это не имело бы смысла - если бы такая конфигурация была разрешена, запросы и ответы дважды проходили бы через пограничную сеть AWS и увеличивали как задержку, так и затраты без предоставление какой-либо выгоды.

person Michael - sqlbot    schedule 03.12.2015
comment
Спасибо! Это именно то, в чем была моя проблема. Это забавно, потому что я раньше развертывал множество сайтов таким образом, и это никогда не было проблемой - я думаю, до сих пор все это было относительно удачей, поскольку мои сайты были в основном одностраничными. Хех. - person rdegges; 03.12.2015
comment
Имеет смысл. Одностраничные сайты будут работать нормально, если вы переопределите корневой объект в конфигурации CloudFront, но для того, чтобы index.html работал где-то еще, или настраиваемые страницы ошибок или правила перенаправления, вам понадобится конечная точка веб-сайта. - person Michael - sqlbot; 03.12.2015
comment
Ага! Огромное спасибо. Очень полезно. Надеюсь, кто-то, совершивший эту глупую ошибку, тоже найдет ваш ответ полезным =) - person rdegges; 03.12.2015
comment
@rdegges - тупой создатель ошибок, проверяющий. С 45 минутами на каждую настройку CloudFront, это заняло один день моей жизни. Поговорим о тонком ... - person markdsievers; 26.09.2017
comment
@markdsievers вы обнаружите, что настройки CloudFront обычно начинают работать в течение нескольких минут. Вам нужно только подождать, пока дистрибутив вернется к Deployed, если есть сомнения относительно того, работает ли изменение не так, как ожидалось. Если вы знаете, что ошиблись, вы можете внести дополнительные изменения без вредных последствий. Это также помогает ускорить устранение неполадок, если вы получаете ошибки, чтобы обнулить минимальные TTL кэширования ошибок - ответы на ошибки кэшируются с использованием разных таймеров. - person Michael - sqlbot; 26.09.2017
comment
Большое спасибо за этот убедительный и четко сформулированный ответ! - person Shea; 19.04.2018
comment
Пошаговые инструкции от AWS: aws.amazon.com/premiumsupport/knowledge-center/ - person Derek Soike; 19.04.2019
comment
Подсказка: если консоль AWS не отображает конечную точку веб-сайта, вы можете ввести ее вручную, просто скопировав ее из свойства корзины статический хостинг веб-сайтов. Обычно это то же самое, но с заменой компонента s3 на s3-website - person vin047; 18.03.2020
comment
Это спасло мне жизнь @ Michael-sqlbot - person sumanth shetty; 01.02.2021

Обнаружена та же проблема, и то, как я ее решил, в CloudFront Origin Settings установил для Origin Domain Name значение <website bucket>.s3-website-us-west-2.amazonaws.com

В CloudFront Создать настройки убедитесь, что index.html указан в качестве корневого объекта по умолчанию.

В S3 убедитесь, что выбрано Использовать этот сегмент для размещения веб-сайта, и установите index.html как Индексный документ.

person Miguel Mota    schedule 19.05.2017
comment
Решение для меня заключалось в том, что кто-то установил корневой объект по умолчанию как /index.html, а не index.html. - person ingh.am; 06.09.2017
comment
Спасибо! Это как раз решение для моего случая. - person Lavande; 27.04.2018
comment
Ты мой мужчина, легенда, ты даже не представляешь, как долго я искал этот ответ! Я использовал аналогичную настройку для хостинга изображений и запуска скрипта изменения размера изображения через лямбда-выражение и API-шлюз. - person Schalk Keun; 30.08.2018
comment
Потрясающие. Это было исправление! - person coderpc; 18.06.2019
comment
Это сработало с дополнительным изменением для меня - моя корзина S3 содержала папку, в которой хранились мои активы. В дополнение к изменениям, упомянутым выше, мне пришлось изменить конечную веб-точку, чтобы добавить свою папку после URL-адреса, например: website bucket>.s3-website-us-west-2.amazonaws.com/MYFOLDER - person Paul G; 06.01.2021

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

ШАГИ:

->go to CloudFront Distributions 
->click the ID
->after Clicking Id you will find different categories like General, Origins and Origin Groups .
->Click the Origins and Origin Groups
->Click the checkbox  of your s3 bucket and click edit
->under grand read Permissions on Bucket click "Yes, Update bucket policy"

Этот шаг решил мою проблему.

person Ravi Teja Mureboina    schedule 18.07.2019

См. Документацию AWS о том, как https://aws.amazon.com/premiumsupport/knowledge-center/cloudfront-serve-static-website/.

Расшифровка содержимого ниже для удобства (или на случай, если ссылка когда-нибудь испортится).


  1. Используйте консоль Amazon S3 для создать сегмент и включить статический хостинг веб-сайтов на ведро.

  2. В диалоговом окне Статический хостинг веб-сайтов скопируйте Конечную точку своего сегмента без начала http: //. Формат похож на bucketname.s3-website-region.amazonaws.com. Конечная точка в этом формате понадобится вам на более позднем этапе.

  3. Добавить политика корзины, которая разрешает общий доступ для чтения к созданному вами сегменту.

  4. Создайте распространение CloudFront в Интернете. Обязательно настройте следующее:

    • For Origin Domain Name, enter the endpoint that you copied in step 2.
    • Для Разрешенных методов HTTP выберите GET, HEAD, OPTIONS.
    • В поле Альтернативные доменные имена (CNAME) введите CNAME, которое вы хотите использовать для своего веб-сайта.
  5. Если вы не хотите использовать SSL (HTTPS) для своего веб-сайта, переходите к следующему шагу. Если вы хотите использовать SSL для своего веб-сайта, вы можете выбрать Запросить или импортировать сертификат с ACM, чтобы запросить сертификат. Для получения дополнительной информации см. Использование альтернативного домена. Имена и HTTPS.

  6. Выберите Создать распространение.

  7. Обновите записи DNS для своего домена, чтобы указать CNAME вашего веб-сайта на доменное имя вашего распространения CloudFront. Вы можете найти доменное имя вашего дистрибутива в консоли CloudFront в формате, аналогичном < strong> d1234abcd.cloudfront.net.

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

person Derek Soike    schedule 19.04.2019

Я столкнулся с той же проблемой, как я ее решил, ниже приведены шаги

  • Перейдите в Amazon S3, а затем перейдите в каталог корзин.

  • Включить статический хостинг веб-сайтов S3  введите описание изображения здесь

  • Перейдите на вкладку «Разрешения» - ›Блокировать весь общий доступ -› снимите флажок «Блокировать весь общий доступ» и сохраните его введите описание изображения здесь

  • Перейдите на вкладку "Разрешения" - ›Политика сегмента -› Изменить и сохранить.

    {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Sid": "PublicRead",
              "Effect": "Allow",
              "Principal": "*",
              "Action": [
                  "s3:GetObject",
                  "s3:GetObjectVersion"
              ],
              "Resource": "arn:aws:s3:::your-bucket-name/*"
          }
      ]
    }
    

Примечание: измените эту строку "Resource": "arn:aws:s3:::your-bucket-name/*"

Ex: "Resource": "arn:aws:s3:::ng-ci-cd-aws-demo/*"

ссылка: https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html

person Saad Qamar    schedule 16.08.2020

Есть несколько требований, чтобы веб-сайты s3 работали с Cloudfront:

  • Объекты в корзине должны быть общедоступными.
  • Объекты в корзине нельзя зашифровать с помощью AWS Key Management Service (AWS KMS).
  • Политика корзины должна разрешать доступ к s3: GetObject.
  • Если политика корзины предоставляет публичный доступ для чтения, то учетная запись AWS, которой принадлежит корзина, также должна владеть объектом.
  • Запрошенные объекты должны существовать в корзине.
  • Amazon S3 Block Public Access должен быть отключен в корзине.
  • Если параметр «Запрашивающий платит» включен, запрос должен включать параметр «запрос-плательщик».
  • Если вы используете заголовок Referer для ограничения доступа из CloudFront к источнику S3, просмотрите настраиваемый заголовок.

https://aws.amazon.com/premiumsupport/knowledge-center/s3-website-cloudfront-error-403/

Основная проблема, с которой я столкнулся, заключалась в том, что есть два типа URL-адресов ведер s3:

Формат конечных точек REST: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro

https://bucket-name.s3.Region.amazonaws.com

Формат конечных точек веб-сайта: https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html

http://bucket-name.s3-website-Region.amazonaws.com
http://bucket-name.s3-website.Region.amazonaws.com

В моем случае мне нужно было использовать URL-адрес веб-сайта, а не URL-адрес REST:

Использование URL-адреса веб-сайта позволит вам использовать функции хостинга веб-сайтов S3, такие как документы индекса / ошибок и правила перенаправления!

person Kim T    schedule 16.10.2020

Вам следует выполнить следующие шаги.

Чтобы обновить политику корзины с помощью консоли CloudFront, выполните следующие действия:

 1. Open the CloudFront console and choose your distribution.
 2. Choose the Origins and Origin Groups tab.
 3. Select the S3 origin and choose Edit.
 4. For Restrict Bucket Access, choose Yes.
 5. For Origin Access Identity, choose the existing identity or create a new one.
 6. For Grant Read Permissions on Bucket, choose Yes, Update Bucket Policy.
 7. Choose Yes, Edit.

Если вы настроили OAI, OAI должен быть включен в политику корзины S3. Если вы добавили OAI в свой дистрибутив CloudFront, вы также должны включить оператор разрешения для OAI в политику корзины S3.

Чтобы проверить, разрешает ли ваша политика корзины OAI, откройте корзину S3 в консоли Amazon S3. Затем выберите вкладку «Разрешения» и просмотрите политику корзины. Ниже приведен пример инструкции allow для OAI:

{
  "Sid": "1",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX"
  },
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
}

Ссылка: https://aws.amazon.com/tr/premiumsupport/knowledge-center/s3-rest-api-cloudfront-error-403/.

person Ramin Mammadzada    schedule 22.10.2020

Размещаете ли вы сайт React на S3? Возможно, с React Router?

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

Если вы, как и я, НЕ хотите делать свою конечную точку S3 общедоступной, и столкнулись с этой проблемой с React Router, когда прямые URL-адреса с маршрутами возвращают 403 Forbidden на CloudFront, читайте дальше:

Это происходит потому, что CloudFront ожидает, что в корзине S3 будет файл, на который предположительно указывает ваш URL.

Например, если у вас есть статический сайт example.com и маршрут / стек, CloudFront попытается найти файл «стека» в вашей корзине S3. Очевидно, этого не существует, и CloudFront вернет ошибку.

Лучший способ решить эту проблему - настроить пользовательскую ошибку в CloudFront. Пользовательский ответ об ошибке может указывать на страницу index.html со статусом 200 OK. Это устранит ошибку, направит пользователя к нужному файлу и в то же время сохранит исходный URL-адрес (example.com/stack), который затем будет выбран React Router.

person sidx64    schedule 20.06.2021

У меня возникла эта проблема, когда я пытался включить имя корзины в свое перенаправление route53 для клиента, чтобы упростить задачу, например:

https://0832234.signin.aws.amazon.com/console/s3/?bucket=clientbucket.com

Щелкнув «Все корзины» и вернувшись в корзину клиентов / или удалив корзину с URL-адреса, я решил, что теперь я могу загружать и открывать файлы.

person DoComputing    schedule 15.06.2016