我使用以下代码获取listBuckets()
,
AmazonS3ClientBuilder s3 = AmazonS3ClientBuilder.standard().withRegion("us-east-1");
AmazonS3 s3Client = s3.build();
bucketList = s3Client.listBuckets();
这里有两件事:
- 它返回存在的所有存储桶的列表,而不考虑区域。
- 作为
Bucket
的每个bucketList()
项仅包含以下属性:
bucket.getName()
bucket.getOwner()
bucket.getCreationDate()
它不包含可以提供它所在的区域的字段/方法。
另外,当我尝试使用此存储桶中的Objects
计数时
s3Client.listObjectsV2(bucket.getName()).getKeyCount())
我得到以下异常:
com.amazonaws.services.s3.model.AmazonS3Exception: The bucket is in this region: us-east-2. Please use this region to retry the request (Service: Amazon S3; Status Code: 301; Error Code: PermanentRedirect;
我完全理解错误,但我需要以下所有方面的帮助:
- 如何仅针对特定区域进行
listBuckets()
,而不为每个区域创建s3Client
。假设我的s3Client
是us-east-1
,如何获取区域ap-south-1
中所有存储桶的列表。 - 我如何知道
listBucket()
响应中存在的每个存储桶的区域,因为只有name, owner, and creation date
属性。 - 如何使用另一个区域的 s3Client 获取另一个区域的
Objects
列表。
我想这与headers
有关.
也是一个额外的帮助(否则我将不得不问另一个问题(
- 在下载和上传对象时,如何显示对象的上传/下载进度,假设我的文件大小为 3GB,我需要一种方法来显示 50% 或半填充的进度条可能显示 1.5GB 已上传/下载。
无法筛选特定区域的ListBuckets
请求,因为构建该请求是为了列出您作为用户可用的所有存储桶。
但是,检索 S3 存储桶后,您可以将每个存储桶的Name
传递到从S3Client
调用的函数 getBucketLocation 中。
通过执行此操作,您将返回区域代码。
此过程的原因是 S3 存储桶被视为全局服务,无论区域如何,每个存储桶名称都是唯一的。碰巧您选择本地数据将存在的区域。
FWIW 我将在 Chris William 的正确答案中添加此方法可能不适用于跨账户存储桶访问。在这些情况下,在不同于其他账户上的存储桶的区域中创建 s3 客户端将导致尝试调用headBucket
时出现重定向响应/错误,并在尝试调用getBucketLocation
时出错。
我能找到的查找存储桶区域甚至跨账户的唯一方法是调用headBucket
并使用重定向响应标头找出正确的区域,如下所示:
S3Client s3 = S3Client.builder().build();
HeadBucketRequest req = HeadBucketRequest.builder().bucket("aicore-segmenter").build();
try {
HeadBucketResponse res = s3.headBucket(req);
} catch (S3Exception e) {
if (e.statusCode() == 301) {
String newRegionName = e.awsErrorDetails().sdkHttpResponse().headers().get("x-amz-bucket-region").get(0);
Region newRegion = Region.of(newRegionName);
}
}