【问题标题】:Get S3 bucket size from aws GO SDK从 aws GO SDK 获取 S3 存储桶大小
【发布时间】:2021-06-03 18:20:01
【问题描述】:

我正在使用 Amazon S3 存储桶上传文件(使用 GO SDK)。当客户的目录大小超过 2GB 时,我需要向客户收费。

bucket内的目录层次结构是:/BUCKET/uploads/CLIENTID/yyyy/mm/dd

为此,我进行了很多搜索。但找不到任何东西。

如何使用 SDK 获取存储桶内的目录大小?

【问题讨论】:

    标签: amazon-web-services go amazon-s3


    【解决方案1】:

    首先/uploads/CLIENTID/yyyy/mm/dd不是S3存储桶中的目录,而是prefix。 AWS 控制台中的 S3 管理 UI 可能会诱使您认为存储桶具有子目录,就像您的计算机文件系统一样,但它们是前缀。

    你的问题真的是:如何获得一个桶内所有对象的总大小,具有给定的前缀?

    希望这段代码sn-p能解开你的疑惑。

    package main
    
    import (
        "context"
        "fmt"
    
        "github.com/aws/aws-sdk-go-v2/aws"
        "github.com/aws/aws-sdk-go-v2/service/s3"
    )
    
    // iterate all objects in a given S3 bucket and prefix, sum up objects' total size in bytes
    // use: size, err := S3ObjectsSize("example-bucket-name", "/a/b/c")
    func S3ObjectsSize(bucket string, prefix string, s3client S3Client) (int64, error) {
        output, err := s3client.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
            Bucket: aws.String(bucket),
            Prefix: aws.String(prefix),
        })
    
        if err != nil {
            return -1, fmt.Errorf("cannot ListObjectsV2 in %s/%s: %s", bucket, prefix, err.Error())
        }
    
        var size int64
        for _, object := range output.Contents {
            size += object.Size
        }
    
        return size, nil
    
    }
    
    // stub of s3.Client for dependency injection
    type S3Client interface {
        ListObjectsV2(ctx context.Context, params *s3.ListObjectsV2Input, optFns ...func(*s3.Options)) (*s3.ListObjectsV2Output, error)
    }
    

    【讨论】:

    • 在 AWS 上使用这种方法计算大小会花费我吗?
    • 代码也无法编译。给我参数数量不匹配的错误。
    • 我相信 LIST 操作会产生成本 (aws.amazon.com/s3/pricing/…),免费套餐适用。
    • 代码 sn-p 用于演示要使用哪个 S3 API,我没有使用任何 AWS 凭证运行它。注意:代码使用 AWS Go SDK V2。
    • 感谢您在列出对象时进行演示。但是代码运行成功,但出现拒绝访问错误。我已经检查了区域和存储桶所有者权限。默认情况下允许所有者列出对象。我应该如何检查这个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 2018-04-30
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    相关资源
    最近更新 更多