Amazon S3Client可正常列举存储桶,但执行putObject时抛出UnknownHostException问题求助
Amazon S3Client可正常列举存储桶,但执行putObject时抛出UnknownHostException问题求助
这个问题我之前踩过坑,大概率是AWS SDK的访问路径模式导致的!
问题原因分析
当你调用listBuckets()时,请求是直接发送到你配置的主endpoint地址:https://cees3.bhinc.gov:10444,这时候DNS能正常解析,所以请求成功。
但执行putObject()时,AWS SDK默认会使用虚拟主机风格构造请求URL——它会把桶名作为子域名拼在主endpoint前面,变成类似https://testbucket2.cees3.bhinc.gov:10444的地址。而你的私有S3存储服务大概率没有配置这个子域名的DNS解析,或者本身不支持虚拟主机模式,所以就抛出了UnknownHostException。
解决方案:开启路径式访问
只需要在构建S3Client时,添加配置强制使用路径式访问(也就是把桶名放在URL路径里,而不是子域名),具体修改如下:
修改你的S3Client构建代码,加上serviceConfiguration配置项:
// Create S3 client S3Client s3Client = S3Client.builder() .credentialsProvider(credentialsProvider) .region(Region.US_EAST_1) .endpointOverride(URI.create("https://cees3.bhinc.gov:10444")) // 新增这部分配置,开启路径式访问 .serviceConfiguration(S3Configuration.builder() .pathStyleAccessEnabled(true) .build()) .overrideConfiguration(ClientOverrideConfiguration.builder() .build()) .build();
这样修改后,上传对象的请求会变成https://cees3.bhinc.gov:10444/testbucket2/[你的对象键],和listBuckets的请求域名一致,就能正常解析了。
额外小提示
看你的代码里putObject的key参数用的是accessKeyId,这应该是测试时的临时写法吧?记得改成实际的对象键(比如"test.png"),不然会把文件覆盖成同一个key哦。
备注:内容来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

