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

AWS S3配置仅允许上传jpg/png/gif策略报Resource must not be empty错误

S3存储桶策略报Resource must not be empty解决方案

问题场景

配置S3存储桶策略限制仅允许上传.jpg、.png、.gif格式文件时,策略保存失败,返回错误:Resource must not be empty,原始使用的策略如下:

{
  "Version": "2012-10-17",
  "Id": "Policy1464968545158",
  "Statement": [
    {
      "Sid": "Stmt1464968483619",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:user/exampleuser"
      },
      "Action": "s3:PutObject",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.jpg",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.png",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.gif"
      ]
    },
    {
      "Sid": "Stmt1464968483619",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:PutObject",
      "NotResource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.jpg",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.png",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.gif"
      ]
    }
  ]
}

报错原因

触发该错误的核心原因是S3存储桶策略的强制语法校验规则:

  • 当语句Effect为Deny、Principal设置为*(匹配所有访问主体)时,语句必须显式声明Resource字段,不能仅使用NotResource做资源范围限定,否则校验逻辑会判定资源范围为空,直接抛出Resource must not be empty错误。
  • 原始策略还存在两个影响正常使用的问题:
    • 两个策略语句使用了完全相同的Sid值,S3策略要求Sid在单个策略内全局唯一,重复值会导致JSON解析时字段映射错乱,触发额外校验异常
    • 资源ARN仅匹配桶根目录下的对应后缀文件,无法覆盖任意层级子目录下的上传请求,即使解决语法报错,也会出现子目录内合法格式文件无法上传的问题

修复方法

调整Deny语句的写法,显式指定资源范围,通过条件判断拦截非允许后缀的上传请求,同时修正SID重复、资源匹配范围不足的问题,修复后的可用策略如下:

{
  "Version": "2012-10-17",
  "Id": "Policy1464968545158",
  "Statement": [
    {
      "Sid": "AllowAuthorizedUserUploadImages",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:user/exampleuser"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    },
    {
      "Sid": "DenyNonImageFileUpload",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition": {
        "StringNotLike": {
          "s3:key": [
            "*.jpg",
            "*.png",
            "*.gif"
          ]
        }
      }
    }
  ]
}

注意:使用前请将策略中的DOC-EXAMPLE-BUCKET替换为你实际的存储桶名称,111111111111、exampleuser替换为实际授权的账号ID、IAM用户名称。该写法通过s3:key条件判断后缀,可自动兼容所有层级子目录下的文件上传,不需要额外写多层通配符匹配规则。

内容的提问来源于stack exchange,提问作者Mehmet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:21:33