首页 文章

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

提问于
浏览
19

我正在尝试设置 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 回答

  • 2

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

    • 创建了一个没有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 URL http://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 ,事情可能需要几个小时(例如一夜之间)才能使自己正确 . 然后它将按照记录的方式工作 .

  • 27

    在我的情况下,我使用多个来源与“路径模式”行为以及我的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 ,它不存在 .

    解决方案

    删除原始路径 .

  • 1

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

  • 2

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

相关问题