代码之家  ›  专栏  ›  技术社区  ›  CodeTalker

Aws如何使用Java SDK知道Bucket的区域

  •  0
  • CodeTalker  · 技术社区  · 4 年前

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

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

    这里有两件事:

    1. 它返回所有存在的Bucket的列表,无论其位于哪个地区。
    2. 每一项 bucketList() 这是一个 Bucket 仅包含以下属性:
    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 对于每个地区。让我们说我的 s3客户端 是的 us-east-1 ,如何获取该地区所有存储桶的列表 ap-south-1 .
    • 我如何知道每个桶所在的区域 listBucket() 响应,因为只有 name, owner, and creation date 属性。
    • 我如何获取以下列表 物体 使用另一个地区的s3Client。

    我想这与 headers .

    还有额外的帮助(否则我将不得不问另一个问题)

    • 在下载和上传对象时,我如何显示对象的上传/下载进度,假设我的文件大小为3GB,我需要一种方法来显示50%或一半的进度条,也许可以显示1.5GB的上传/卸载进度。
    0 回复  |  直到 4 年前
        1
  •  1
  •   Chris Williams Tihomir Paskalev    4 年前

    无法过滤以下特定请求 ListBuckets 在构建请求时,将请求发送到特定区域,以列出您作为用户可用的所有bucket。

    但是,一旦检索到S3存储桶,就可以传递 Name 将每个桶放入函数中 getBucketLocation 呼叫从 S3Client .

    通过这样做,您将返回地区代码。

    此过程的原因是S3存储桶被视为全局服务,每个存储桶的名称都是唯一的,与地区无关。恰好,您可以选择本地数据将存在于哪个区域。

        2
  •  1
  •   Oren    4 年前

    FWW我将补充Chris William的正确答案,即这种方法可能不适用于跨帐户bucket访问。在这些情况下,在与其他帐户上的bucket不同的区域中创建s3客户端将导致在尝试调用时出现重定向响应/错误 headBucket ,尝试呼叫时出错 getBucketLocation .

    我能找到的查找bucket区域甚至跨帐户的唯一方法是致电 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);
            }
        }