Django/AWS - 调用 HeadObject 操作时发生错误(403):禁止

Posted

技术标签:

【中文标题】Django/AWS - 调用 HeadObject 操作时发生错误(403):禁止【英文标题】:Django/AWS - An error occurred (403) when calling the HeadObject operation: Forbidden 【发布时间】:2022-01-08 01:10:51 【问题描述】:

我正在尝试将我的 Django 项目设置为在 AWS S3 存储桶上托管静态图像,但是当我尝试通过 Django 管理面板上传图像时出现以下错误

这些是我在 Django 中的设置

AWS_ACCESS_KEY_ID = 'some_key' 
AWS_SECRET_ACCESS_KEY = 'some_key_aswell' 
AWS_STORAGE_BUCKET_NAME = 'bucket_name'

AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

AWS_S3_REGION_NAME = 'us-east-2' 

存储桶的 Cors 策略设置

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

【问题讨论】:

【参考方案1】:

运行 Django 应用程序的机器(或容器)使用的 IAM 角色需要添加以下 IAM 策略:


    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Action": [
              "s3:GetObject",
            ],
            "Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
        
    ]

如果您的对象已加密,请确保您还允许您的 IAM 角色使用用于加密您的对象的 KMS 密钥。

【讨论】:

我已经有了政策,但问题仍然存在。存储桶设置为 us-east-2,但我上周已经旅行了,我在世界各地。这会导致问题吗?我的意思是在不同的地区。 您的存储桶加密了吗?通常,当我看到HeadObject 操作被拒绝访问时,这是因为 IAM 角色必须更正对 S3 存储桶的访问,但无法获取对象,因为它无权访问其加密密钥。

以上是关于Django/AWS - 调用 HeadObject 操作时发生错误(403):禁止的主要内容,如果未能解决你的问题,请参考以下文章

Django AWS Elastic Beanstalk 迁移数据库

Django AWS Elastic Beanstalk WSGIPath 引用了一个不存在的文件

Django AWS Elastic-Beanstalk WSGI.py 配置

Django,AWS EB 错误,您的 WSGIPath 引用了一个不存在的文件

使用带有 Compressor 的 Boto 的 Django AWS S3 无法压缩 UncompressableFileError

Django AWS RDS 环境变量未在 Elastic Beanstalk 中设置