使用Java SDK2调用S3 putObject时遇Access Denied异常求助
问题:使用AWS S3 Java SDK v2写入字节数组时遭遇Access Denied错误
我尝试使用Java SDK v2(依赖为software.amazon.awssdk:s3)将字节数组写入S3存储桶,但始终收到Access Denied错误。以下是相关配置和代码:
权限策略(已设置为宽松权限)
{ "Sid": "VisualEditor1", "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::*", "arn:aws:s3:*:896591375297:accesspoint/*", "arn:aws:s3::896591375297:accesspoint/*", "arn:aws:s3-object-lambda:*:896591375297:accesspoint/*", "arn:aws:s3:::*/*", "arn:aws:s3:*:896591375297:job/*", "arn:aws:s3:us-west-2:896591375297:async-request/mrap/*/*", "arn:aws:s3:*:896591375297:storage-lens/*" ] }
相关Java代码
public void saveCA(String orgId, String certId, byte[] caData) { PutObjectRequest req = PutObjectRequest.builder() .bucket("cacache-bucket") // 尝试过在这里使用ARN,无效。桶确实存在 .key(certId) // certId作为对象名称 .build(); RequestBody body = RequestBody.fromBytes(caData); client.putObject(req, body); }
收到的错误信息
software.amazon.awssdk.services.s3.model.S3Exception: Access Denied (Service: S3, Status Code: 403, Request ID: RQH01Z7PJ54YDSAV, Extended Request ID: vJRt...
请问有什么排查思路?
排查思路
- 确认凭证有效性:检查代码使用的AWS凭证(Access Key/Secret Key或IAM角色)是否属于绑定上述策略的实体,同时确认凭证未过期、未被权限边界、服务控制策略(SCP)等其他规则限制。
- 核对桶的归属与区域:确认
cacache-bucket所属AWS账号为896591375297,且客户端配置的区域与桶的实际区域一致——S3是区域化服务,区域不匹配可能引发隐性权限问题。 - 检查桶策略:除了IAM实体的权限策略,还要查看目标桶自身的桶策略,确认是否存在优先于Allow规则的Deny语句,限制了写入操作。
- 验证对象锁与版本控制:若桶开启了版本控制或对象锁,检查当前操作是否违反相关配置,比如尝试写入已被锁定的对象键。
- 排查凭证加载逻辑:确认Java客户端是否正确加载凭证——比如是否通过环境变量、系统属性、凭证文件或IAM角色(若在ECS/EKS/EC2上运行)获取,而非使用了错误的凭证。
- 开启调试日志排查请求:开启SDK的调试日志,查看请求的签名信息、使用的凭证ARN,确认请求确实使用了预期的IAM实体权限。
- 验证资源ARN匹配:尽管策略包含
arn:aws:s3:::*和arn:aws:s3:::*/*,仍需确认目标桶的ARN是否被覆盖——比如桶名是否拼写正确,策略中的资源范围是否包含该桶及桶内对象。
内容的提问来源于stack exchange,提问作者Jim ReesPotter
相关产品推荐
相关产品推荐

