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

Ken*_*ter 7 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));
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 10

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

AmazonS3ClientBuilder builder.withForceGlobalBucketAccessEnabled(true)
Run Code Online (Sandbox Code Playgroud)

构建客户端...请参阅s3客户端构建器文档

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

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

s3client.headBucket(HeadBucketRequest("mybucketname")).getBucketRegion()
Run Code Online (Sandbox Code Playgroud)


sti*_*vlo 3

然而,如文档中所述,路径样式语法要求您在尝试访问存储桶时使用特定于区域的端点。换句话说,通过路径样式访问,您必须告诉 SDK 存储桶位于哪个区域,它不会尝试自行确定。

就性能而言,不应该有区别。