AWS 如何使用 Java 开发工具包了解存储桶的区域



我使用以下代码获取listBuckets()

AmazonS3ClientBuilder s3 = AmazonS3ClientBuilder.standard().withRegion("us-east-1");
AmazonS3 s3Client = s3.build();
bucketList = s3Client.listBuckets();

这里有两件事:

  1. 它返回存在的所有存储桶的列表,而不考虑区域。
  2. 作为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。假设我的s3Clientus-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);
}
}

最新更新