S3 SDK可以自己找出一个桶的区域吗?

时间:2013-06-14 21:37:55

标签: java amazon-s3

我正在编写可能会访问不同地区的存储桶的Amazon S3客户端。我们的IT部门对传出HTTP非常严格,我想对此客户端使用路径式访问,以避免为每个新存储桶更改防火墙。

我的客户端使用java SDK v1.4.4.2。作为测试,我在新加坡创建了一个存储桶,然后进行了一个列出对象的工作S3单元测试,并将其更改为使用路径式访问:

AmazonS3 client = new AmazonS3Client(environ);
client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));

当我使用此版本的客户端运行单元测试时,所有S3访问都会失败,并且我必须设置正确的端点。

我的问题是,我是否必须添加逻辑来查找存储区域并为客户端设置该区域?或者SDK可以设置为自己做吗?似乎SDK应该能够自动执行此操作,因为查找存储桶位置的功能就在那里。

作为一个侧面问题,使用路径式访问是否存在任何特定的性能问题?如果我还不知道的话,我认为只是额外的往返查询桶的位置。

2 个答案:

答案 0 :(得分:8)

如果您需要客户端访问不同区域中的对象,您可能希望使用以下选项:

AmazonS3ClientBuilder builder.withForceGlobalBucketAccessEnabled(true)

建立您的客户...请参阅the s3 client builder documentation

这可确保成功请求,即使客户端默认区域与目标存储桶/对象不同。

此外,如果您需要获取存储桶" mybucketname "确切的终点,您可以使用(headBucketResult ref page):

s3client.headBucket(HeadBucketRequest("mybucketname")).getBucketRegion()

答案 1 :(得分:3)

documentation中所述,但是,路径样式语法要求您在尝试访问存储桶时使用区域特定的端点。换句话说,对于路径样式访问,您需要告诉SDK哪个区域是存储桶,它不会尝试自己确定它。

表现明智,应该没有区别。