【问题标题】: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?

【问题讨论】:

    标签: javascript aws-sdk


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 2020-11-06
      • 1970-01-01
      • 2017-10-19
      • 2023-03-14
      • 1970-01-01
      • 2022-01-03
      • 2017-06-26
      • 2018-02-01
      相关资源
      最近更新 更多