如何检查 AWS S3 中是不是已存在存储桶

Posted

技术标签:

【中文标题】如何检查 AWS S3 中是不是已存在存储桶【英文标题】:How to check if bucket already exists in AWS S3如何检查 AWS S3 中是否已存在存储桶 【发布时间】:2020-11-06 11:07:15 【问题描述】:

如何使用 Java SDK 检查存储桶是否已存在于我的 Aws S3 账户中?

使用下面的代码

        AmazonS3ClientBuilder.defaultClient().doesBucketExistV2(bucketName);

检查存储桶的全局存在,如果具有此名称的存储桶全局存在则返回 true,即使我不是该存储桶的所有者或我无权访问该存储桶。

我了解以这种方式制作此方法的意图,以便它允许我们确定存储桶名称的可用性,但这不是我需要的。 当然,它会抛出我以后无法访问它的异常,但它会返回说明该名称的存储桶存在。

我想检查具有给定名称的存储桶是否存在于我的 S3 帐户中,以便我可以对其执行操作。

一个可能的解决方案是list所有存储桶并在返回的列表中搜索我的存储桶,我认为这不是一个好的性能(如果我错了,请纠正我),因为可能有数百个数千个桶,在其中搜索效率不高。

如何确定我的 S3 帐户中是否存在未检查全局存在的存储桶?

【问题讨论】:

HeadBucket api 是否满足您的需求? docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html 我不认为“全球性”意味着它返回您的 S3 账户之外的存储桶,只是它们没有像很多 AWS 资源那样的区域 @mattfreake 基本上假设我的 S3 帐户没有名为“mybucket”的存储桶,上面共享的代码 sn-p 返回 true,因为 globe 中的其他人实际上有一个名为“mybucket”的存储桶.它不会返回我的存储桶或它的内容,但它返回 true 因为存在具有此名称的存储桶。 首先,您将需要对 S3 存储桶的权限,否则您将无法访问该存储桶。然后,挑战将是它是否实际上与您的凭证在同一个账户中 - 例如,您的凭证可能有权访问其他账户中的存储桶。看看getBucketAcl() @jellycsc 是的,headBucket api 是我一直在寻找的东西。太感谢了。 :) 【参考方案1】:

正如 cmets 中提到的那样,headBucket 完成了这项工作。

HeadBucketRequest headBucketRequest = HeadBucketRequest.builder()
            .bucket(bucketName)
            .build();

    try 
        s3Client.headBucket(headBucketRequest);
        return true;
     catch (NoSuchBucketException e) 
        return false;
    

【讨论】:

以上是关于如何检查 AWS S3 中是不是已存在存储桶的主要内容,如果未能解决你的问题,请参考以下文章

使用 boto3 检查 s3 的存储桶中是不是存在密钥

如何测试 AWS S3 上是不是存在存储桶

Ruby v2 的 aws-sdk:在我将对象放入 S3 存储桶后检查成功状态

AWS CDK 错误:存储桶上已存在存储桶策略

如何检查从 aws S3 到雪花的数据加载结果

AWS S3 通过 boto - 检查磁盘空间