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

时间:2017-02-15 14:13:21

标签: amazon-web-services amazon-s3 amazon-cloudfront

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

<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存储桶中的所有文件...

*更新*

此云端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。如何禁用此功能?

6 个答案:

答案 0 :(得分:33)

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

  • 创建了 Amazon S3存储桶,没有存储桶策略
  • 上传 public.jpg 并通过&#34;公开&#34;
  • 公开
  • 已上传 private.jpg 并将其保密为
  • 创建了Amazon CloudFront 网络分发
    • 来源域名:从列表中选择我的S3存储桶
    • 限制存储分区访问:
    • 原始访问标识:创建新标识
    • 授予Bucket读取权限:是,更新存储桶策略

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

分发标记为In Progress一段时间。说到Enabled后,我通过xxx.cloudfront.net网址

访问了这些文件
  • xxx.cloudfront.net/public.jpg 重定向我到S3网址http://bucketname.s3.amazonaws.com/public.jpg。是的,我可以看到该文件,但它不应该使用重定向。
  • xxx.cloudfront.net/private.jpg 重定向我也是,但之后我收到Access Denied,因为它是S3中的私人文件。
然后我做了一些research,发现这种情况很常见。有些人通过将其CloudFront分配指向静态托管网站URL 来使用解决方法,但这样做的缺点是它不能与Origin Access Identity一起使用,我也怀疑它不会收到到边缘的免费S3流量&#39;折扣。

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

我在cloudFront'分发设置'的常规标签下的Default Root Object中添加了'index.html',它对我有用。 因为index.html是我项目的根文件!

答案 3 :(得分:2)

在我的情况下,我使用“路径模式”行为的多个来源以及我的S3存储桶中的原始路径:

设置错误:

CloudFront行为: /images/* - &gt; My-S3-origin

MY-S3-来源: 起源路径:/images

S3文件: /images/my-image.jpg

GET请求: /images/my-image.jpg - &gt; 403

发生的事情是整个CloudFront GET请求被发送到原点:/image/my-image.jpg以Origin Path:/images为前缀,因此进入S3的请求看起来像/images/images/my-image.jpg存在。

解决方案

删除Origin Path。

答案 4 :(得分:0)

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

此处有官方答复:AWS Forun link,创建新存储桶后必须等待几个小时,然后才能正确运行云前端分发。

解决方案是暂时从您的一个旧存储桶中工作,然后在几个小时后切换到新存储桶。

答案 5 :(得分:0)

我还从CloudFront获得了403,但是我的问题有所不同,因此在这里共享它可能会对其他人有所帮助。

确保您在存储桶策略中定义的原始访问ID是正确的:

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

原始访问身份ID大致类似于E19F48VV5H01ZD。

您可以在https://console.aws.amazon.com/cloudfront/home#oai上找到所有的原始访问身份 在您的身份下的CloudFront配置中查找您正在使用的一个: enter image description here