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
相关产品推荐
相关产品推荐

