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

IBM COS S3存储中S3Client生成错误请求地址的原因排查

IBM COS S3Client 配置导致请求主机名异常问题

存储桶详情

Bucket Name: icos-abc-prod-01-abc-02
Endpoint:  https://icos.abc.us-region.internal.das

当前S3Client创建代码

credentials = new BasicAWSCredentials(VAL_ACCESS_KEY_ID, VAL_SECRET_ACCESS_KEY);
if (1==1) {
    log.info("Trying to get file system of S3 Compatible.");
    S3Client = AmazonS3ClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(credentials))
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(
                    VAL_END_POINT_REGION, "us-east-1"))
            .build();
    bucketName = VAL_BUCKET_NAME;
}

执行代码及问题

执行以下代码时:

if (S3Client.doesObjectExist(bucketName, tempTgtFileName))
{
}

程序实际使用的主机名是icos-abc-prod-01-abc-02.icos.abc.us-region.internal.das(即bucketname.endpoint格式,不含https),但预期主机名应为icos.abc.us-region.internal.das。


问题原因及解决方法

问题出在未启用路径样式访问(Path-Style Access):AWS S3Client默认使用虚拟主机样式(Virtual Hosted-Style),会把桶名拼在主机域名前面;而IBM COS需要使用路径样式,桶名作为URL路径的一部分,而非主机名的一部分。

修改S3Client构建代码,添加.withPathStyleAccessEnabled(true)配置即可解决:

credentials = new BasicAWSCredentials(VAL_ACCESS_KEY_ID, VAL_SECRET_ACCESS_KEY);
if (1==1) {
    log.info("Trying to get file system of S3 Compatible.");
    S3Client = AmazonS3ClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(credentials))
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(
                    VAL_END_POINT_REGION, "us-east-1"))
            .withPathStyleAccessEnabled(true) // 启用路径样式访问
            .build();
    bucketName = VAL_BUCKET_NAME;
}

启用路径样式后,请求会以https://icos.abc.us-region.internal.das/icos-abc-prod-01-abc-02/[object-name]的格式发送,主机名保持为你配置的端点地址,符合预期。

内容的提问来源于stack exchange,提问作者Pranav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:35:21