【问题标题】:Django static files to AWS S3 return 403 forbiddenDjango 静态文件到 AWS S3 返回 403 禁止
【发布时间】:2022-01-27 06:15:07
【问题描述】:

我正在开发一个部署在 Heroku 的 Django(3) 项目。我正在尝试使用 Django 存储连接 AWS S3 以将静态和媒体文件上传到 S3 存储桶。

注意:我搜索了很多并尝试了我找到的所有解决方案,但没有解决我的问题,所以请不要将其标记为重复!

我创建了一个启用公共访问的 S3 存储桶并添加了以下 CORS 配置:

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

另外,创建了一个具有编程访问权限的 IAM 用户并将权限授予S3FullAccess

这就是我在 **settings.py** 中的内容

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
AWS_QUERYSTRING_AUTH = False
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
AWS_S3_REGION_NAME = 'us-east-1'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage'

如果我直接从存储桶打开文件,我可以在浏览器中看到该文件,但是当我加载我的网站 (pythonist.org) 时,这些文件返回 403 forbidden

以下是浏览器的网络选项卡对文件的响应:

Summary
URL: https://s3.amazonaws.com/pythonist.org/css/normalize.css
Status: 403 Forbidden
Source: Network
Initiator: 
pythonist.org:18

不知道这里有什么问题, 提前致谢!

【问题讨论】:

  • 您确定存储桶是公开的吗?当您说直接从存储桶管理员打开时,在删除 URL 中的所有 GET 参数后,您仍然可以访问该文件吗? (我猜不是因为它应该指向与 https://s3.amazonaws.com/pythonist.org/css/normalize.css 完全相同的 URL)

标签: python django amazon-s3 python-django-storages


【解决方案1】:

您的存储桶似乎无法公开访问。您的公共存储桶应该有一个像这样的存储桶策略(带有一些已删除属性的示例):

{
    "Id": "Policy1640778083903",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1640778050694",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::pythonist.org",
                "arn:aws:s3:::pythonist.org/*"
            ],
            "Principal": {
                "AWS": [
                    "YOUR_IAM_USER"
                ]
            }
        },
        {
            "Sid": "Stmt1640778082281",
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::pythonist.org/*",
            "Principal": "*"
        }
    ]
}

您的 IAM 用户拥有任何权限,而公众只能获取对象(此处不能从根目录获取,请根据您的需要更改)。使用AWS Policy Generator 创建您的策略

【讨论】:

  • 将此策略添加到 bucker 并将 IAM_User 替换为 IAM user name 但它显示 Invalid principal in policy
  • 现在你应该可以复制粘贴了。确保存储桶 ARN 正确。
猜你喜欢
  • 2021-06-17
  • 2021-07-09
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2015-04-25
  • 2018-02-20
相关资源
最近更新 更多