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

调用S3 GetObjectRequest时触发S3Exception(403)问题求助

排查AWS SDK S3客户端403错误(路径式访问场景)

问题根源

你将bucket参数设为"/bucketname"是错误操作,这会导致SDK生成的请求路径、签名计算出现偏差,进而触发403权限验证失败。同时,AWS SDK S3客户端默认使用虚拟主机样式访问(bucketname.host),而你的服务需要路径样式(host/bucketname),必须显式配置启用路径样式访问。

解决方案步骤

  1. 修正Bucket参数
    移除bucket名称前的斜杠,直接使用纯bucket名称:

    var request = Packages.software.amazon.awssdk.services.s3.model.GetObjectRequest.builder()
                .bucket("bucketname")                                      
                .key("key")
                .build();
    
  2. 启用路径样式访问配置
    在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();
    
  3. 额外验证项

    • 确认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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:30:13