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

Posted

技术标签:

【中文标题】如何测试 AWS S3 上是不是存在存储桶【英文标题】:How do I test if a bucket exists on AWS S3如何测试 AWS S3 上是否存在存储桶 【发布时间】:2018-11-23 08:47:46 【问题描述】:

如何使用 aws-sdk 测试 AWS S3 上是否存在存储桶?


这个问题是为了测试一个对象是否存在于一个桶中:How to determine if object exists AWS S3 Node.JS sdk

这个问题是针对 Python 的:How can I check that a AWS S3 bucket exists?

【问题讨论】:

【参考方案1】:

您可以使用以下代码:

// import or require aws-sdk as AWS
// const AWS = require('aws-sdk');

const checkBucketExists = async bucket =>  
  const s3 = new AWS.S3();
  const options = 
    Bucket: bucket,
  ;
  try 
    await s3.headBucket(options).promise();
    return true;
   catch (error) 
    if (error.statusCode === 404) 
      return false;
    
    throw error;
  
;

重要的是要意识到如果存储桶不存在,错误statusCode 将是404

【讨论】:

您能解释一下为什么要添加.promise() 链吗? aws 文档使用了一个与您不同的非常简单的示例。我可能没有看到你做的事情。 docs.aws.amazon.com/AWSjavascriptSDK/latest/AWS/… .promise() 允许使用async / await 我在使用 aws-sdk 2.484.0 尝试此操作时收到 400 Bad 请求,前提是该存储桶之前已存在。使用我从未创建过的存储桶名称,代码可以工作【参考方案2】:

要测试存储桶是否存在,请检查 createBucket 回调方法中的 statusCode 属性。如果是409,那么之前已经创建过了。我希望这足够清楚吗?

const ID = ''//Your access key id
const SECRET = ''//Your AWS secret access key

const BUCKET_NAME = ''//Put your bucket name here

const s3 = new AWS.S3(
    accessKeyId: ID,
    secretAccessKey: SECRET
)

const params = 
    Bucket: BUCKET_NAME,
    CreateBucketConfiguration: 
        // Set your region here
        LocationConstraint: "eu-west-1"
    

s3.createBucket(params, function(err, data) 
   if (err && err.statusCode == 409)
    console.log("Bucket has been created already");
   else
       console.log('Bucket Created Successfully', data.Location)
   
)

【讨论】:

请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常质量更高,更有可能吸引投票。【参考方案3】:

看起来在 this 从 aws-sdk v2 更改为 v3 之后,您无法使用 headBucket() 进行此操作。

对于使用 v3 的用户,您可以试一试:

const  S3Client, HeadBucketCommand  = require('@aws-sdk/client-s3');

const checkBucketExists = async (bucket) => 
    const client = new S3Client();
    const options = 
        Bucket: bucket,
    ;

try 
    await client.send(new HeadBucketCommand(options));
    return true;
 catch (error) 
    if (error.statusCode === 404) 
        return false;
    
    throw error;

【讨论】:

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

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

AWS S3 CLI - 如何使用存储桶上设置的所有当前策略获取 JSON?

SonataMediaBundle - S3 AWS:'配置的存储桶“我的存储桶”不存在

如何将 AWS S3 存储桶与远程非 AWS 服务器上的文件同步?

AWS S3:更改策略后无法列出存储桶

AWS S3 存储桶 CORS 策略错误:请求的资源上不存在“Access-Control-Allow-Origin”标头