(使用 aws-sdk)如何查找存储在 amazon s3 中的文件夹的总大小

(using aws-sdk) How to find total size of a folder stored in amazon s3

我想知道使用 AWS-SDK 存储在 S3 中的文件夹的总大小。

Note:-

I don't want to use any command or AWS console to find the size of my folder I wanted to do this by aws-sdk and I mentioned it above so please don't mark this as duplicate.

到目前为止,我在互联网上找到的是列出文件夹的所有对象并迭代抛出它,我这样做并且工作正常。 这是我的代码:-

import AWS from 'aws-sdk';

AWS.config.region = "BUCKET_REGION";
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
   IdentityPoolId: "COGNITO_ID",
});
let bucketName = "BUCKET_NAME"
let bucket = new AWS.S3({
                params: {
                    Bucket: bucketName
                }
             });

 bucket.listObjects({Prefix:"FOLDER_NAME",Bucket:"BUCKET_NAME"}, function (err, data) {
        if (err) {
           console.log(err)                        
        } else {
           console.log(data)
           //data returns the array throw which I iterate and find the total size of the object
        }
  });

但问题在于,有时我的文件夹包含如此多的对象,以至于很难迭代列表中的每个元素。仅计算文件夹的大小就需要花费很多时间。

所以我需要一种更好的方法来计算文件夹的大小,而我只找到了这个命令

aws s3 ls s3://myBucket/level1/level2/ --recursive --summarize | awk 'BEGIN{ FS= " "} /Total Size/ {print }'

有什么方法可以完成上述过程并抛出我的 aws-sdk

感谢任何形式的帮助。提前致谢

看来您的情况是:

  • 您想定期了解 Amazon S3 存储桶的大小
  • 桶中包含大量对象,耗时过长

与其列出对象和计算大小,我推荐两种替代方法:

亚马逊 S3 库存

Amazon S3 Inventory 可以提供每日 CSV 文件,其中包含存储桶中所有对象的详细信息。然后您可以获取这些数据并计算总数。

Amazon CloudWatch 存储桶指标

Amazon CloudWatch 有几个与 Amazon S3 存储桶相关的指标:

  • BucketSizeBytes
  • NumberOfObjects

我不确定这些指标多久更新一次(它们不是即时的),但 BucketSizeBytes 似乎对你来说很理想。

如果一切都失败了...

如果以上两个选项不能满足您的需求(例如,您需要了解指标 "right now"),剩下的选项就是维护您自己的对象数据库.每当从存储桶中添加或删除对象时,数据库都需要更新(这可以通过使用 Amazon S3 事件触发 AWS Lambda 函数来完成)。然后,您可以查询自己的数据库,以便快速获得可用信息。

这个 lambda 方法 非常快,如果您不担心几秒钟的延迟,它可以很好地处理包含多达 100,000 个对象的存储桶。 AWS CLI 具有大致相同的性能,因为它似乎使用相同的 API,并且 S3 Metrics 或 Cloudwatch Stats 可能是配置起来更复杂,尤其是当您只想查看特定文件夹时。

将其存储在数据库的信息中并使用标志在间隔内触发该方法是用于小型存储桶或文件夹的方法。

const AWS = require('aws-sdk'), s3 = new AWS.S3()

exports.handler = async function (event) {
    var totalSize = 0, ContinuationToken
  do {
    var resp = await s3.listObjectsV2({
      Bucket: bucketName,
      Prefix: `folder/subfolder/`,
      ContinuationToken
    }).promise().catch(e=>console.log(e))
    resp.Contents.forEach(o=>totalSize+=o.Size)
    ContinuationToken = resp.NextContinuationToken
  } while (ContinuationToken)

  console.log(totalSize) //your answer
}