【问题标题】:Permission Denied for media files at AWS S3 with Heroku and Django使用 Heroku 和 Django 在 AWS S3 上拒绝媒体文件的权限
【发布时间】:2020-12-23 06:10:30
【问题描述】:

为了让用户升级我的django 项目中的一些图像,我决定使用 AWS S3 存储桶。

我已经学习了几个教程,我的媒体存储后端似乎一切都很好,因为我可以看到我的存储桶上的更新文件。

问题是网站中没有提供图片。当我尝试打开它时,会出现一个简单的 XML,显示“拒绝访问”错误:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>33BFF888CD1CA014</RequestId>
    <HostId>UEeWZpvsQzOoIvq9uSz7Xqo7KAFhHmsPsXxEGwxaDW6V1mM2B0EccXSMXj0NXCnbi+VlwlL9d00=</HostId>
</Error>

一些可能有用的信息:

  1. 我的 IAM 用户位于具有 AmazonS3FullAccess 策略的组中;
  2. 我已尝试启用对我的存储桶的公开访问,但没有成功;
  3. 我的存储桶位于 us-east-2 区域;
  4. 我根据thisheroku教程更新了bucket CORS配置。

你知道什么可能导致这个错误吗?

非常感谢!

【问题讨论】:

  • 这些图片是否应该是公开的——可以通过浏览器访问?如果是,那么您的存储桶策略是什么?
  • 是的,图片应该是公开的。我没有为我的存储桶设置任何策略。有什么建议吗?

标签: django amazon-web-services heroku amazon-s3


【解决方案1】:

默认情况下,所有存储桶和对象都是私有的。要启用对图像的公开访问,您必须设置 存储桶策略 以启用该功能:

例如:

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicRead",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::awsexamplebucket1/*"]
    }
  ]
}

您可以使用aws:Referer 条件进一步限制可从您的网站访问的政策。但请注意,aws:Referer 的使用并不是限制仅从您的域访问存储桶的防弹解决方案,它可以很容易地规避。

您还必须禁用阻止 public access settings

如果您不想公开您的存储桶,您可以在存储桶前面使用 CloudFront 来提供对图像的公开访问:

【讨论】:

  • 现在我将使用公共访问权限。我不知道我还需要为存储桶创建一个策略(我坚持只禁用阻止公共访问设置就可以了)。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 2019-07-16
  • 2014-10-20
  • 2019-07-12
相关资源
最近更新 更多