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

Java应用中S3Client调用createBucket报UnknownHostException,但AWS CLI命令可正常创建桶的问题排查

Java应用中S3Client调用createBucket报UnknownHostException,但AWS CLI命令可正常创建桶的问题排查

我最近碰到一个特别费解的问题:我的Java应用连接NetApp StorageGRID的S3 API网关时,listBuckets操作能正常跑通,但一调用createBucket或者putObject就会抛出这个异常:

software.amazon.awssdk.core.exception.SdkClientException: Received an UnknownHostException

最开始我以为是权限不足,毕竟列表桶能成功但创建桶不行,还打算找NetApp管理员确认权限。不过我用AWS CLI命令却能毫无问题地创建桶:

aws --endpoint-url https://theendpointurltomynetappstoragegrid:10444 s3api create-bucket --bucket testbucket11

而我在Java代码里是这么实现创建桶逻辑的:

String accessKeyId = "MyAccessKeyID";
String secretAccesskey = "MySecretAccessKey";
String endpointUrl = "https://theendpointurltomynetappstoragegrid:10444";

StaticCredentialsProvider credentialsProvider = StaticCredentialsProvider.create(
            AwsBasicCredentials.create(accessKeyId, secretAccesskey));
    
// 创建S3客户端
S3Client s3Client = S3Client.builder()
        .credentialsProvider(credentialsProvider)
        .region(Region.US_EAST_1)
        .endpointOverride(URI.create(endpointUrl))
        .overrideConfiguration(ClientOverrideConfiguration.builder()
        .build())
    .build();

// 这个listBuckets能正常执行,说明连接是没问题的
ListBucketsResponse listBucketsResponse = s3Client.listBuckets();

CreateBucketRequest createBucketRequest = CreateBucketRequest.builder()
                        .bucket("testbucket11")
                        .build();

// 这里总是抛出SdkClientException: Received an UnknownHostException
s3Client.createBucket(createBucketRequest);

折腾了半天我才找到根源:AWS SDK默认会用虚拟主机样式构造请求URL(比如把桶名拼到域名前面,变成testbucket11.theendpointurltomynetappstoragegrid:10444),但我的NetApp StorageGRID不支持这种格式,导致域名解析失败抛出UnknownHostException。而AWS CLI默认是用路径样式访问的,所以能正常工作。

解决方法其实很简单,只需要在构建S3Client的时候加上.forcePathStyle(true)配置,强制SDK使用路径样式的URL(桶名会作为URL路径的一部分,而不是域名前缀):

// 修改后的S3 Client构建代码
S3Client s3Client = S3Client.builder()
        .credentialsProvider(credentialsProvider)
        .region(Region.US_EAST_1)
        .endpointOverride(URI.create(endpointUrl))
        .forcePathStyle(true) // 关键配置:强制启用路径样式访问
        .overrideConfiguration(ClientOverrideConfiguration.builder()
        .build())
    .build();

加上这个配置后,createBucket操作就和CLI一样能正常执行了。

备注:内容来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:44:34