Доступ AWS CloudFront запрещен в ведро S3

Я пытаюсь установить CloudFront для обслуживания статических файлов, размещенных в моем коврике S3. У меня есть дистрибутив настройки, но я получаю AccessDenied при попытке перейти к файлу CSS (/CSS/stlyle.css) внутри ведра S3:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>E193C9CDF4319589</RequestId>
    <HostId>
xbU85maj87/jukYihXnADjXoa4j2AMLFx7t08vtWZ9SRVmU1Ijq6ry2RDAh4G1IGPIeZG9IbFZg=
    </HostId>
</Error>

Я установил свой дистрибутив CloudFront в свой ведро S3 и создал новый Origin Access Identity policy, который был добавлен автоматически в ведро S3:

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E21XQ8NAGWMBQQ"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::myhost.com.cdn/*"
        }
    ]
}

Я что-то пропустил?

Я хочу, чтобы все мои файлы в этом ведре S3 служили через CloudFront...

* ОБНОВЛЕНИЕ *

Этот облачный фронт guide говорит:

По умолчанию ваш ведро Amazon S3 и все объекты в нем являются частными: только учетная запись AWS, которая создала ведро, имеет разрешение на чтение или запись объектов в ней. Если вы хотите разрешить кому-либо доступ к объектам в вашем ковше Amazon S3 с использованием URL-адресов CloudFront, вы должны предоставить публичные разрешения на чтение для объектов. (Это одна из самых распространенных ошибок при работе с CloudFront и Amazon S3. Вы должны явно предоставлять привилегии каждому объекту в ведро Amazon S3.)

Таким образом, на основе этого я добавил новые разрешения для всех объектов внутри ведра S3 до Everyone Read/Download. Теперь я могу получить доступ к файлам.

Но теперь, когда я обращаюсь к файлу типа https://d3u61axijg36on.cloudfront.net/css/style.css, он перенаправляется на S3 URI и HTTP. Как отключить это?

Ответ 1

Чтобы помочь с вашим вопросом, я воссоздал ситуацию через:

  • Создал ведро Amazon S3 без политики ведомости
  • Загружено public.jpg и опубликует его через "Сделать общедоступным"
  • Загружено private.jpg и сохранено в нем
  • Создал веб-дистрибутив Amazon CloudFront :
    • Происхождение доменного имени: Выбрано мое ведро S3 из списка
    • Ограничить доступ к ведру: Да
    • Идентификатор доступа к исходным данным: Создать новую идентификацию
    • Разрешить чтение разрешений в bucket: Да, обновить ведро.

Я проверил ведро, и CloudFront добавила политику Bucket, похожую на вашу.

Распределение помечалось как In Progress некоторое время. Как только он сказал Enabled, я обратился к файлам через URL xxx.cloudfront.net:

  • xxx.cloudfront.net/public.jpg перенаправлено меня к URL-адресу S3 http://bucketname.s3.amazonaws.com/public.jpg. Да, я мог видеть файл, но он не должен использовать перенаправление.
  • xxx.cloudfront.net/private.jpg перенаправлено, но я получил Access Denied, потому что это частный файл в S3.

Затем я сделал несколько исследование и обнаружил, что это довольно распространенное явление. Некоторые люди используют обходной путь, указывая свой дистрибутив CloudFront на статический URL-адрес веб-хостинга, но это имеет тот недостаток, что он не будет работать с Identity Access Identity, и я также подозреваю, что он не получит ' бесплатный трафик S3 к скину края.

Итак, я ждал всю ночь, проверил это сегодня утром и все работает нормально.

Итог: Даже если он говорит Enabled, для правильной работы может потребоваться несколько часов (например, на ночь). Затем он будет документироваться.

Ответ 2

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

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

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

My-S3-происхождения: Происхождение: /images

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

Запрос GET: /images/my -image.jpg → 403

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

Решение

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