我正在尝试设置 CloudFront
来提供托管在我的 S3
存储桶中的静态文件 . 我有设置分发,但是当我尝试浏览S3存储桶中的CSS( /CSS/stlyle.css
)文件时,我得到 AccessDenied
:
<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/*"
}
]
}
我错过了什么?
我希望通过CloudFront提供此S3存储桶中的所有文件...
*** UPDATE ***
这个 Cloud 前端guide说:
默认情况下,您的Amazon S3存储桶及其中的所有对象都是私有的 - 只有创建存储桶的AWS账户才有权读取或写入其中的对象 . 如果要允许任何人使用CloudFront URL访问Amazon S3存储桶中的对象,则必须授予对象的公共读取权限 . (这是使用CloudFront和Amazon S3时最常见的错误之一 . 您必须明确授予Amazon S3存储桶中每个对象的权限 . )
所以基于此我已经为S3桶中的所有对象添加了新的权限到 Everyone Read/Download
. 现在我可以访问文件了 .
但是现在当我访问像 https://d3u61axijg36on.cloudfront.net/css/style.css
这样的文件时,它被重定向到S3 URI和 HTTP
. 如何禁用此功能?
4 回答
为了帮助解决您的问题,我通过以下方式重建了这种情况:
创建了一个没有Bucket Policy的 Amazon S3 bucket
已上传 public.jpg 并通过"Make Public"公开
已上传 private.jpg 并将其保密
创建了Amazon CloudFront web distribution :
Origin Domain Name: 从列表中选择了我的S3存储桶
Restrict Bucket Access: 是的
Origin Access Identity: 创建新标识
Grant Read Permissions on Bucket: 是,更新存储桶策略
我检查了存储桶,CloudFront添加了与您类似的存储桶策略 .
分发标记为
In Progress
一段时间 . 一旦它说Enabled
,我通过xxx.cloudfront.net
URL访问了这些文件:xxx.cloudfront.net/public.jpg
redirected 我转到S3 URLhttp://bucketname.s3.amazonaws.com/public.jpg
. 是的,我可以看到该文件,但它不应该使用重定向 .xxx.cloudfront.net/private.jpg
redirected 我也是,但我接收了Access Denied
因为它是S3中的私人文件 .然后我做了一些research,发现这种情况很常见 . 有些人通过将他们的CloudFront分配指向 static hosted website URL 来使用解决方法,但这样做的缺点是它不能与Origin Access Identity一起使用,我也怀疑它赢得了边缘'折扣的免费S3流量 .
所以,我等了一夜,今天早上测试了它, everything is working fine .
Bottom line: 即使它说
ENABLED
,事情可能需要几个小时(例如一夜之间)才能使自己正确 . 然后它将按照记录的方式工作 .在我的情况下,我使用多个来源与“路径模式”行为以及我的S3存储桶中的原始路径:
设置错误:
CloudFront行为:
/images/*
- >My-S3-origin
My-S3-origin:Origin Path:
/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
,它不存在 .解决方案
删除原始路径 .
请不要为Origin Domain Name选择默认的s3存储桶,而是输入 <bucket-name>.s3-website.<region>.amazonaws.com 作为源域名(您可以在S3存储桶属性下的静态网站托管属性中获取此URL) .
我在cloudFront 'Distribution Settings'的常规标签下的
Default Root Object
中添加了'index.html',它对我有用 . 因为index.html是我项目的根文件!