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


91

Ми намагаємось розповсюджувати відра 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

Я думаю, я спробував це раніше, і це не вийшло, але я просто змінив його знову, і це вже в процесі розповсюдження. Я додам політику відра до своєї публікації :)
Джордан Адамс

Відповіді:


91

Якщо ви отримуєте доступ до кореня розповсюдження CloudFront, вам потрібно встановити кореневий об’єкт за замовчуванням: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

Щоб вказати основний об’єкт root за допомогою консолі CloudFront:

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

  • У списку дистрибутивів у верхній панелі виберіть розподіл для оновлення.

  • На панелі Інформація про розподіл на вкладці Загальні натисніть Редагувати .

  • У діалоговому вікні " Редагувати розподіл " у полі Об'єкт за замовчуванням введіть ім'я файлу кореневого об'єкта за замовчуванням.

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

  • Щоб зберегти зміни, натисніть Так, Редагувати .


У моєму випадку це налаштування не вирішило проблему. Я все ще отримую помилку з доступом, заборонену
KurioZ7

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. (Це також зробить непотрібне налаштування Root Object за замовчуванням , але все-таки не завадить його встановити)

Ідеальна відповідь на дату цього коментаря.
Сай Рамачандран

Це було і для мене. У мене вже працював інший веб-сайт, і я думав, що налаштував новий однаково. Так легко не помітити це.
Гюнтер Еберль

Вам також потрібно додати загальні дозволи GetObject і ListObjects до відра.
Жорж

8

У мене була така ж проблема, як і @Cezz, хоча рішення не працювало б у моєму випадку.

Як тільки статичний хостинг веб-сайтів увімкнено для відра, це означає, що користувачі можуть отримати доступ до вмісту або через URL-адресу Cloudfront, або через URL-адресу S3, що не завжди бажано. Наприклад, у моєму випадку розподіл Cloudfront увімкнено SSL, і користувачі не повинні мати доступ до нього через з'єднання, яке не є SSL.

Я знайшов рішення:

  • залишати відключеним статичний хостинг веб-сайтів у відрі S3
  • зберігати походження розповсюдження Cloudfront як ідентифікатор S3
  • встановіть "Обмежити доступ до відра" на "Так" (і для зручності дозвольте CloudFront автоматично оновлювати політику ковша)
  • на "Сторінках помилок" створіть власну відповідь та позначте код помилки "403: Заборонено" на потрібну сторінку відповідей, тобто /index.html, з кодом відповіді 200

Зауважте, що в моєму випадку я обслуговую програму javascript для однієї сторінки, де всі шляхи вирішені index.html. Якщо у вашому S3 відрізці є шляхи, що вирішують різні об'єкти, це не працюватиме.


1
Дякую за вашу відповідь. Цей працював на мене. У мене була така ж проблема, як у вас. Я не хотів, щоб люди отримували доступ до мого відра S3, тому мені потрібно було обмежити доступ до S3 Origin, який працює лише тоді, коли ви заповнюєте джерело, як це запропонувало автодоповнення в Cloudfront. З одного боку, зауважте, що вам не доведеться вимикати статичний хостинг веб-сайтів. Досить просто видалити політику ковша, яка дозволяє публічному доступу.
Торстен

Це було дуже корисно, заборонене повідомлення надходить від S3, якого я спочатку не усвідомлював, тому вам доведеться це зрозуміти за допомогою спеціальної сторінки помилок, щоб ваш SPA працював.
Іван

4

У моєму випадку я використовував декілька джерел з поведінкою "Шаблон Шлях" разом із Шляхом походження в моєму відрі S3:

Погане налаштування:

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

My-S3-походження: Шлях походження: /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

У моєму випадку я неправильно налаштував маршрут 53. Я створив псевдонім у своєму домені, але вказав на відро S3 замість дистрибутива CloudFront.

Також я опустив основний об'єкт root. Консоль справді можна вдосконалити, якби вони додали трохи тексту до тексту питання про можливі наслідки її опущення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.