调用S3 GetObjectRequest时触发S3Exception(403)问题求助
排查AWS SDK S3客户端403错误(路径式访问场景)
问题根源
你将bucket参数设为"/bucketname"是错误操作,这会导致SDK生成的请求路径、签名计算出现偏差,进而触发403权限验证失败。同时,AWS SDK S3客户端默认使用虚拟主机样式访问(bucketname.host),而你的服务需要路径样式(host/bucketname),必须显式配置启用路径样式访问。
解决方案步骤
修正Bucket参数
移除bucket名称前的斜杠,直接使用纯bucket名称:var request = Packages.software.amazon.awssdk.services.s3.model.GetObjectRequest.builder() .bucket("bucketname") .key("key") .build();启用路径样式访问配置
在S3Client构建时添加路径样式访问配置,让SDK生成host/bucketname格式的请求路径:var s3Config = Packages.software.amazon.awssdk.services.s3.S3Configuration.builder() .pathStyleAccessEnabled(true) .build(); var client = Packages.software.amazon.awssdk.services.s3.S3Client.builder() .credentialsProvider(credentials) .region(region) .endpointOverride(uri) .serviceConfiguration(s3Config) // 新增路径样式配置 .build();额外验证项
- 确认
ackey和secretkey拥有目标bucket的s3:GetObject权限,权限策略需覆盖对应资源(如arn:aws:s3:::bucketname/key) - 检查endpoint是否正确指向你的S3兼容服务地址,确保网络连通性
- 验证本地时间与服务端时间同步,签名验证对时间差敏感(通常允许15分钟内偏差)
- 确认bucket名称和key真实存在,部分S3兼容服务会用403代替404返回资源不存在的情况
- 确认
修改后的完整代码示例
var awsBasicCredentials = Packages.software.amazon.awssdk.auth.credentials.AwsBasicCredentials.create("ackey","secretkey"); var credentials = Packages.software.amazon.awssdk.auth.credentials.StaticCredentialsProvider.create(awsBasicCredentials); var region = Packages.software.amazon.awssdk.regions.Region.AWS_CN_GLOBAL; var uri = Packages.java.net.URI.create("http://host"); // 配置路径样式访问 var s3Config = Packages.software.amazon.awssdk.services.s3.S3Configuration.builder() .pathStyleAccessEnabled(true) .build(); var client = Packages.software.amazon.awssdk.services.s3.S3Client.builder() .credentialsProvider(credentials) .region(region) .endpointOverride(uri) .serviceConfiguration(s3Config) .build(); var request = Packages.software.amazon.awssdk.services.s3.model.GetObjectRequest.builder() .bucket("bucketname") .key("key") .build(); var response = client.getObject(request); return response;
内容的提问来源于stack exchange,提问作者Sergey1
相关产品推荐
相关产品推荐

