amazon-web-services - AWS CloudFront 访问 S3 存储桶被拒绝

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

我正在尝试设置 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 存储桶,并创建了新的源访问身份策略,该策略会自动添加到 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 存储桶及其中的所有对象都是私有(private)的 — 只有创建该存储桶的 AWS 账户才有权读取或写入其中的对象。如果您希望允许任何人使用 CloudFront URL 访问您的 Amazon S3 存储桶中的对象,您必须授予这些对象的公共(public)读取权限。 (这是使用 CloudFront 和 Amazon S3 时最常见的错误之一。您必须向 Amazon S3 存储桶中的每个对象显式授予权限。)

因此,基于此,我向 Everyone Read/Download 添加了对 S3 存储桶内所有对象的新权限。现在我可以访问文件了。

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

最佳答案

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

  • 创建了一个没有存储桶策略的 Amazon S3 存储桶
  • 已上传 public.jpg 并通过“公开”将其公开
  • 已上传private.jpg并保密
  • 创建了 Amazon CloudFront 网络分配:
    • 源域名:从列表中选择了我的 S3 存储桶
    • 限制存储桶访问:
    • 源访问身份:创建新身份
    • 授予存储桶读取权限:是,更新存储桶策略

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

该分发一度被标记为进行中。一旦显示Enabled,我就通过xxx.cloudfront.net URL访问这些文件:

  • xxx.cloudfront.net/public.jpg 重定向我到 S3 URL http://bucketname.s3.amazonaws.com/public.jpg 。是的,我可以看到该文件,但它不应该使用重定向。
  • xxx.cloudfront.net/private.jpg 重定向了我,但随后我收到了访问被拒绝,因为它是一个私有(private)文件S3。

然后我做了一些research并发现这是很常见的现象。有些人通过将其 CloudFront 分配指向静态托管网站 URL 来使用解决方法,但这有一个缺点,即它无法与原始访问身份一起使用,而且我还怀疑它不会收到“免费 S3 流量到边缘的折扣。

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

底线:即使显示已启用,事情也可能需要几个小时(例如一夜之间)才能恢复正常。然后它将按照文档的方式工作。

关于amazon-web-services - AWS CloudFront 访问 S3 存储桶被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42251745/

相关文章:

node.js - 在 ElasticBeanstalk 上运行 Grunt

amazon-web-services - 从 aws lambda 触发 Gitlab-ci

mysql - RDS MySQL 5.7 和 Entity Framework

amazon-s3 - 子目录上的 S3 hive 外部表不起作用

amazon-web-services - 使用 cloudfront 的 s3 上的访问被拒绝错误

ruby-on-rails-4 - 如何在 Rails 4 中指定asset_host?

cdn - 是否有任何 CDN 允许重写请求 URI,以便客户端路由与浏览器刷新配合得很好?

python-2.7 - Docker构建失败

Android 将图像从设备库上传到 Amazon S3 服务器

amazon-s3 - 亚马逊 s3cmd ls