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
相关产品推荐
相关产品推荐

