S3预签名URL生成成功但访问提示Access Denied问题排查
解决S3预签名URL上传出现Access Denied的问题
常见问题排查与解决方法
1. IAM用户权限不足
生成预签名URL的IAM用户必须具备对应操作的权限:
- 上传需要
s3:PutObject权限 - 后续下载需要
s3:GetObject权限
给该用户绑定以下IAM策略(替换YOUR_BUCKET_NAME为你的桶名):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:PutObject", "s3:GetObject"], "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*" } ] }
2. 桶策略或阻止公共访问设置干扰
默认配置的桶会开启阻止公共访问,但这不会影响预签名URL的合法请求。需要:
- 检查桶策略,确保没有
Deny语句拦截PutObject/GetObject操作 - 若桶策略为空,优先排查IAM权限问题
3. 上传请求与预签名参数不匹配
上传请求的所有参数必须和生成预签名URL时完全一致:
- 上传文件的
Content-Type必须是image/jpeg(和代码中PutObjectCommand的设置一致) - 必须使用
PUT方法发起上传请求 - 上传的
Key(文件路径/名称)不能和生成URL时的key参数不一致
4. 临时凭证过期(若使用临时凭证)
如果使用的是IAM角色临时凭证,需确认凭证未过期且包含所需权限。代码中使用长期密钥可忽略此点。
快速验证步骤
- 用AWS CLI测试IAM权限:执行
aws s3 cp local-test.jpg s3://YOUR_BUCKET_NAME/test.jpg,成功则权限无问题 - 检查上传请求的请求头,确认
Content-Type符合要求 - 开启S3访问日志,查看拒绝请求的具体错误码和信息,精准定位问题
内容的提问来源于stack exchange,提问作者Matias Pizzi
相关产品推荐
相关产品推荐

