AWS CloudFront访问被拒绝到S3存储桶

Pri*_*ome 26 amazon-s3 amazon-web-services amazon-cloudfront

我正在尝试设置CloudFront为我的S3存储桶中托管的静态文件.我有设置分发,但我AccessDenied在尝试浏览/CSS/stlyle.cssS3存储桶中的CSS()文件时得到:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>E193C9CDF4319589</RequestId>
    <HostId>
xbU85maj87/jukYihXnADjXoa4j2AMLFx7t08vtWZ9SRVmU1Ijq6ry2RDAh4G1IGPIeZG9IbFZg=
    </HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)

我已将我的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/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

我希望通过CloudFront提供此S3存储桶中的所有文件...

*更新*

这个云前端指南说:

默认情况下,您的Amazon S3存储桶及其中的所有对象都是私有的 - 只有创建存储桶的AWS账户才有权读取或写入其中的对象.如果要允许任何人使用CloudFront URL访问Amazon S3存储桶中的对象,则必须授予对象的公共读取权限.(这是使用CloudFront和Amazon S3时最常见的错误之一.您必须明确授予Amazon S3存储桶中每个对象的权限.)

所以基于此我已经为S3 bucket中的所有对象添加了新的权限Everyone Read/Download.现在我可以访问文件了.

但现在当我访问这样的文件https://d3u61axijg36on.cloudfront.net/css/style.css被重定向到S3 URI和HTTP.如何禁用此功能?

Joh*_*ein 37

为了帮助解决您的问题,我通过以下方式重建了这种情况:

  • 创建了一个没有Bucket Policy 的Amazon S3存储
  • 上传了public.jpg并通过"公开"公开
  • 上传private.jpg并将其保密
  • 创建了Amazon CloudFront Web分配:
    • Origin Domain Name:从列表中选择我的S3存储桶
    • 限制存储桶访问:
    • 源访问标识:创建新标识
    • 授予Bucket读取权限:是,更新存储桶策略

我检查了存储桶,CloudFront添加了与您类似的存储桶策略.

分发标记In Progress了一段时间.说完之后Enabled,我通过xxx.cloudfront.netURL 访问了这些文件:

  • xxx.cloudfront.net/public.jpg 重定向到S3 URL http://bucketname.s3.amazonaws.com/public.jpg.是的,我可以看到该文件,但它不应该使用重定向.
  • xxx.cloudfront.net/private.jpg 重定向了我,但后来我收到了,Access Denied因为它是S3中的私人文件.

然后我做了一些研究,发现这种情况很常见.有些人通过将其CloudFront分配指向静态托管网站URL来使用解决方法,但这样做的缺点是它不能与Origin Access Identity一起使用,我还怀疑它不会收到"免费S3流量到边缘"折扣.

所以,我等了一夜,今天早上测试了一切,一切正常.

底线:即使它说ENABLED,事情可能需要几个小时(例如一夜之间)才能使自己正确.然后它将按照记录的方式工作.

  • 对我来说不明显的是,云端网址不包含存储桶名称.即'xxxx.cloudfront.net/:path'而不是'xxxx.cloudfront.net/bucketname/:path' (2认同)
  • 如果我可以两次投票赞成,那我会的。这些东西花了我数小时的生命。 (2认同)
  • @ john-rotenstein我没有关注您的回答。如果我将存储桶中的对象设为公开,则可以通过CloudFront分发URL访问它们。那很棒!但是我也可以直接通过S3 URL访问它们。我实施了OAI,以便只有我的CloudFront dist可以读取我的对象,而其他人都不能读取。如果我的对象是公开的,我不理解该用法。我误会了你的答案吗?我可以提供更多信息来澄清我的问题吗? (2认同)
  • 如果您看到cloudfront将您重定向到s3资产(输入cloudfront域后检查您的url),那么这(等待几个小时)很可能是解决方案。 (2认同)

Zoh*_*Ali 10

我在Default Root ObjectcloudFront的“分发设置”的“常规”选项卡下添加了“ index.html” ,它对我有用。因为index.html是我项目的根文件!

  • 这些事情一直在建议我“离开所有这些东西,去务农”。 (25认同)
  • 确保它是“index.html”而不是“/index.html” (5认同)
  • 祝福你。我对此感到非常烦恼,并添加根对象修复了它! (2认同)
  • 哇,救星。并且一定要有耐心。事情传播或发生任何需要发生的事情大约需要 30 秒(这就是为什么我最初认为设置这个“可选”字段不是解决办法),但是是的,告诉它“index.html”是默认根对象为我修复了它。 (2认同)

uda*_*ddy 9

请不要输入默认的s3存储桶作为“原始域名”,而请输入“ <bucket-name>.s3-website.<region>.amazonaws.com原始域名”(您可以在S3存储桶属性下的“静态网站托管”属性中获取此URL)。


Sur*_*esh 5

如果您使用刚刚创建的存储桶,则可能会发生这种情况。

根据此处的官方回复:AWS Forun 链接,创建新存储桶后必须等待几个小时才能让云前端分发正确运行。

解决方案是暂时使用旧存储桶之一进行工作,并在几个小时后切换到新存储桶。