我正在编写可能会访问不同地区的存储桶的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应该能够自动执行此操作,因为查找存储桶位置的功能就在那里。
作为一个侧面问题,使用路径式访问是否存在任何特定的性能问题?如果我还不知道的话,我认为只是额外的往返查询桶的位置。
答案 0 :(得分:8)
如果您需要客户端访问不同区域中的对象,您可能希望使用以下选项:
AmazonS3ClientBuilder builder.withForceGlobalBucketAccessEnabled(true)
建立您的客户...请参阅the s3 client builder documentation
这可确保成功请求,即使客户端默认区域与目标存储桶/对象不同。
此外,如果您需要获取存储桶" mybucketname "确切的终点,您可以使用(headBucketResult ref page):
s3client.headBucket(HeadBucketRequest("mybucketname")).getBucketRegion()
答案 1 :(得分:3)
如documentation中所述,但是,路径样式语法要求您在尝试访问存储桶时使用区域特定的端点。换句话说,对于路径样式访问,您需要告诉SDK哪个区域是存储桶,它不会尝试自己确定它。
表现明智,应该没有区别。