You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

S3文件上传触发403权限错误,请求排查Bucket Policy及代码问题

S3上传触发HeadObject 403 Forbidden错误的排查与修复

问题详情

上传文件到S3时出现403禁止错误:

ClientError at /api/document/ An error occurred (403) when calling the HeadObject operation: Forbidden

当前使用的Bucket Policy:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "AllowGetAndHead",
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:PutObjectAcl"
        ],
        "Resource": "arn:aws:s3:::monover-052023-s3bucket/*"
    },
    {
        "Sid": "S3PolicyStmt-DO-NOT-MODIFY-1684257818955",
        "Effect": "Allow",
        "Principal": {
            "Service": "logging.s3.amazonaws.com"
        },
        "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:PutObjectAcl"
        ],
        "Resource": "arn:aws:s3:::monover-052023-s3bucket/*"
    }
]
}

Django settings.py配置(已确认AWS凭证有效):

DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"

AWS_ACCESS_KEY_ID = "AKIAZO7XJSQ54CWZNR6K"
AWS_SECRET_ACCESS_KEY = "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"
AWS_STORAGE_BUCKET_NAME = "django-monover-textract"
AWS_QUERYSTRING_AUTH = False
AWS_S3_FILE_OVERWRITE = False

一、Bucket Policy 问题分析

  1. 缺少HeadObject权限:当前Policy的第一个Statement里,允许的Action没有包含s3:HeadObject,而s3boto3在上传文件前会自动调用这个接口检查文件是否存在或获取元数据,没有权限就会触发403。
  2. Bucket名称完全不匹配:Policy对应的Bucket是monover-052023-s3bucket,但settings里配置的操作Bucket是django-monover-textract——等于给Bucket A开了权限,代码却在操作Bucket B,这是核心错误。

二、代码/配置问题分析

  1. Bucket配置不一致:如上所述,settings里的AWS_STORAGE_BUCKET_NAME和Policy绑定的Bucket完全不同,导致权限不生效。
  2. 存储类默认行为:即使设置了AWS_S3_FILE_OVERWRITE=False,s3boto3仍会默认调用HeadObject确认文件是否存在,缺少该权限直接报错。
  3. Block Public Access拦截:如果目标Bucket开启了「Block all public access」,即使Policy允许*访问,也会被强制拦截,导致权限失效。

修复步骤

  1. 统一Bucket名称:要么把settings里的AWS_STORAGE_BUCKET_NAME改成monover-052023-s3bucket,要么给django-monover-textract配置包含必要权限的Policy。
  2. 补充HeadObject权限:在允许客户端访问的Statement中添加s3:HeadObject,修改后的Action列表如下:
"Action": [
    "s3:GetObject",
    "s3:PutObject",
    "s3:PutObjectAcl",
    "s3:HeadObject"
]
  1. 检查Block Public Access设置:登录S3控制台,查看目标Bucket的Block Public Access选项,若需要公共访问,不要勾选「Block all public access」;如果是内部使用,建议把Policy的Principal从*改成对应的IAM用户/角色,更安全。

内容的提问来源于stack exchange,提问作者Noel S Jacob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:57:23