Доступ 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
, который не существует.
Решение
удалить исходный путь.