8

我正在编写一个可能访问不同区域的存储桶的 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 应该能够自动执行此操作,因为查找存储桶位置的功能就在那里。

作为一个附带问题,使用路径式访问是否存在任何特定的性能问题?如果我还不知道存储桶的位置,我想这只是一次额外的往返行程。

4

2 回答 2

19

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

AmazonS3ClientBuilder builder.withForceGlobalBucketAccessEnabled(true)

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

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

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

s3client.headBucket(HeadBucketRequest("mybucketname")).getBucketRegion()
于 2017-09-08T08:22:13.203 回答
3

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

性能方面,应该没有区别。

于 2013-06-14T21:50:27.497 回答