Amazon Cloudfront с S3. Доступ не разрешен

92

Мы пытаемся распространять блоки S3 через Cloudfront, но по какой-то причине единственным ответом является документ AccessDenied XML, подобный следующему:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>89F25EB47DDA64D5</RequestId>
    <HostId>Z2xAduhEswbdBqTB/cgCggm/jVG24dPZjy1GScs9ak0w95rF4I0SnDnJrUKHHQC</HostId>
</Error>

Вот настройки, которые мы используем:

Настройки распространения Настройки происхождения

А вот и политика для ведра

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity *********"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::x***-logos/*"
        }
    ]
}
Джордан Адамс
источник
Настройки поведения кэша - imgur.com/JBZqrRm
Джордан Адамс
Убедитесь, что Cloudfront может читать из корзины S3.
Натан C
Как бы я включил или проверил это?
Джордан Адамс
Исходные настройки, последний вариант. Смотрите свой скриншот. :)
Натан C
Я думаю, что попробовал это раньше, и это не сработало, но я просто изменил это снова, и оно находится в процессе распространения. Я добавлю политику ведра к своему посту :)
Джордан Адамс

Ответы:

93

Если вы получаете доступ к корню вашего дистрибутива CloudFront, вам нужно установить корневой объект по умолчанию: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

Чтобы указать корневой объект по умолчанию с помощью консоли CloudFront:

  • Войдите в консоль управления AWS и откройте консоль Amazon CloudFront по адресу https://console.aws.amazon.com/cloudfront/ .

  • В списке рассылок в верхней панели выберите дистрибутив для обновления.

  • На панели Сведения о распространении на вкладке Общие нажмите кнопку Изменить .

  • В диалоговом окне « Изменить распространение » в поле « Корневой объект по умолчанию» введите имя файла корневого объекта по умолчанию.

    Введите только имя объекта, например index.html,. Не добавляйте / перед именем объекта.

  • Чтобы сохранить изменения, нажмите Да, Изменить .

Kousha
источник
В моем случае этот параметр не решил проблему. Я все еще получаю сообщение об
отказе в
53

У меня только что возникла та же проблема, и хотя ответ Куши решает проблему для index.html в корневом пути, моя проблема была также с подкаталогами, так как я использовал их в сочетании с index.html для получения «симпатичных URL» (пример .com / что-то / а не "некрасивый" example.com/something.html)

Частично это и вина Amazon, потому что когда вы настраиваете дистрибутив CloudFront, он предлагает вам сегменты S3 на выбор, но если вы выберете один из них, он будет использовать URL-адрес корзины, а не статический URL-адрес хостинга веб-сайта в качестве бэкэнда.

Итак, чтобы решить проблему:

  • Включить статический хостинг для сайта
  • Установите индексный документ (и, возможно, ошибку ) соответствующим образом
  • Скопируйте URL-адрес конечной точки - вы можете найти его рядом с вышеуказанными настройками - Он должен выглядеть примерно так: <bucket.name> .s3-website- <aws-region> .amazonaws.com
  • Используйте этот URL в качестве источника CloudFront Distribution. (Это также сделает ненужной настройку корневого объекта CF по умолчанию , но в любом случае это не помешает)
Мирослав
источник
Идеальный ответ на дату этого комментария.
Саи Рамачандран
Это было и для меня. У меня уже работал другой веб-сайт, и я подумал, что настроил новый идентично. Так легко не заметить этого.
Гюнтер Эберл
Вам также необходимо добавить публичные разрешения GetObject и ListObjects в корзину.
Жорж
8

У меня была та же проблема, что и у @Cezz, хотя в моем случае решение не сработало.

Как только статический хостинг веб-сайтов включен для корзины, это означает, что пользователи могут получить доступ к контенту либо через URL-адрес Cloudfront, либо через URL-адрес S3, что не всегда желательно. Например, в моем случае дистрибутив Cloudfront поддерживает SSL, и пользователи не должны иметь доступ к нему через соединение без SSL.

Решение, которое я нашел, было:

  • оставьте статический хостинг отключенным на S3 bucket
  • сохранить источник распространения Cloudfront в качестве идентификатора S3
  • установите для параметра «Ограничить доступ к корзине» значение «Да» (и для простоты разрешите CloudFront для автоматического обновления политики корзины)
  • на «страницах ошибок» создайте пользовательский ответ и сопоставьте код ошибки «403: запрещено» с нужной страницей ответа, например /index.html, с кодом ответа 200

Обратите внимание, что в моем случае я работаю с одностраничным приложением javascript, где все пути разрешаются с помощью index.html. Если у вас есть пути, которые разрешают различные объекты в вашей корзине S3, это не будет работать.

Джонни Грин
источник
1
Спасибо за Ваш ответ. Этот работал для меня. У меня была такая же проблема, как и у вас. Я не хотел, чтобы люди получали доступ к моей корзине S3, поэтому мне нужно было ограничить доступ к источнику S3, который работает только при заполнении источника, как предложено при автозаполнении в Cloudfront. Однако стоит отметить, что вам не нужно отключать статический хостинг веб-сайтов. Достаточно просто удалить политику корзины, которая разрешает публичный доступ.
Торстен
Это было действительно полезно, запретное сообщение пришло от S3, которое я сначала не осознавал, поэтому вы должны поймать это на специальной странице с ошибкой, чтобы ваш SPA работал.
Иван
4

В моем случае я использовал несколько источников с поведением Path Pattern вместе с Origin Path в моем контейнере S3:

Плохая настройка:

Поведение CloudFront: /images/*->My-S3-origin

My-S3-origin: Origin Path: /images

S3 файлы: /images/my-image.jpg

ПОЛУЧИТЬ запрос: /images/my-image.jpg -> 403

Происходило то, что весь запрос CloudFront GET отправлялся в источник: с /image/my-image.jpgпрефиксом Origin Path:, /imagesпоэтому запрос в S3 выглядит так, как будто /images/images/my-image.jpgего не существует.

Решение

удалить исходный путь.

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

Скотт Юнгвирт
источник
1

В моем случае я неправильно настроил Route 53. Я создал псевдоним в своем домене, но указал его на S3 Bucket вместо дистрибутива CloudFront.

Также я опустил корневой объект по умолчанию. Консоль действительно может быть улучшена, если они добавят немного информации в текст вопросительного знака о потенциальных последствиях ее пропуска.

toon81
источник