【问题标题】:(using aws-sdk) How to find total size of a folder stored in amazon s3(使用 aws-sdk)如何查找存储在 amazon s3 中的文件夹的总大小
【发布时间】:2020-06-16 23:26:06
【问题描述】:

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

注意:-

我不想使用任何命令或 AWS 控制台来查找我的 我想通过 aws-sdk 执行此操作的文件夹,我在上面提到过 请不要将此标记为重复。

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

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 $3}'

我有什么办法可以完成上述过程,扔掉我的 aws-sdk

感谢任何形式的帮助。在此先感谢

【问题讨论】:

  • 如果 python 是一个选项:stackoverflow.com/a/58220730/9931092
  • 这实际上和我正在做的一样它迭代抛出我不想做的文件夹的所有对象。
  • 哦抱歉我刚才注意到了..
  • 好的没问题,如果有其他方法可以告诉我
  • 您需要一次性操作还是定期操作?

标签: amazon-web-services amazon-s3 aws-sdk nodes


【解决方案1】:

这个 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
}

【讨论】:

    【解决方案2】:

    看来你的情况是:

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

    与其列出对象和计算大小,我会推荐两种选择:

    Amazon S3 清单

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

    Amazon CloudWatch 存储桶指标

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

    • BucketSizeBytes
    • NumberOfObjects

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

    如果一切都失败了......

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

    【讨论】:

    • 谢谢,伙计,我认为 lambda 函数是最有效的方法。你能建议我什么是最好的方法吗
    • 您必须自己编写代码。使用 Amazon S3 事件触发 Lambda 函数。该 Lambda 函数需要使用添加/删除的对象更新您选择的数据库。选择合适的数据库取决于您将如何使用数据。例如,这取决于您是按用户还是按路径检索数据、进行搜索等。这不是微不足道的,因此请确保您不能只使用更简单的选项之一。
    猜你喜欢
    • 2023-03-12
    • 2015-11-18
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多