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

How to check if bucket already exists in AWS S3

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

使用下面的代码

        AmazonS3ClientBuilder.defaultClient().doesBucketExistV2(bucketName);

检查存储桶是否在全球范围内存在,如果具有此名称的存储桶在全球范围内存在,则 returns 为真,即使我不是该存储桶的所有者或我无权访问该存储桶。

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

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

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

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

HeadBucket 请求即可完成工作。

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

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

SDK 1.x 没有 HeadBucketRequest 构建器,也没有 NoSuchBucketException

万一有人正在使用 AWS SDK for Java 1.x 寻找答案,这有效:

private boolean checkAccessToBucket(final String bucketName) {
    try {
        final HeadBucketRequest request = new HeadBucketRequest(bucketName);
        s3Client.headBucket(request);
        return true;
    } catch (AmazonServiceException ex) {
        if (ex.getStatusCode() == 404 | ex.getStatusCode() == 403 || ex.getStatusCode() == 301) {
            return false;
        }
        throw ex;
    } catch (Exception ex) {
        LOGGER.error("Cannot check access", ex);
        throw ex;
    }
}