You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用.NET获取AWS S3存储桶总大小及空间使用情况

.NET 高效获取AWS S3存储桶总大小方案

AWS S3本身没有直接返回桶总大小的单API,但可以通过以下两种高效方案实现需求,无需手动逐个文件计算,同时无需设置存储桶公开访问(强烈建议关闭公开配置,通过IAM权限控制访问即可)。

实时准确计算(批量枚举对象)

通过AWS SDK for .NET的批量分页接口获取对象列表,批量累加大小,相比逐个请求效率提升数倍,结果实时准确。

实现步骤

  1. 安装AWS S3 SDK包:
Install-Package AWSSDK.S3
  1. 编写批量计算代码:
using Amazon.S3;
using Amazon.S3.Model;

public async Task<long> GetS3BucketTotalSizeAsync(string bucketName)
{
    long totalSize = 0;
    string continuationToken = null;

    // 推荐通过IAM角色或本地配置文件初始化客户端,避免硬编码密钥
    var s3Client = new AmazonS3Client();

    do
    {
        var request = new ListObjectsV2Request
        {
            BucketName = bucketName,
            ContinuationToken = continuationToken
        };

        var response = await s3Client.ListObjectsV2Async(request);

        // 批量累加当前页所有对象的大小
        totalSize += response.S3Objects.Sum(obj => obj.Size);

        continuationToken = response.NextContinuationToken;
    } while (continuationToken != null);

    return totalSize;
}

优化说明

  • 异步处理避免主线程阻塞,提升并发性能
  • 单次请求最多返回1000个对象,大幅减少API调用次数
  • 仅需给IAM实体授予s3:ListBucket权限,无需公开存储桶

近似值快速获取(CloudWatch指标)

如果可以接受最多24小时的数据延迟,可直接获取AWS预计算的存储桶大小指标,无需枚举任何对象,性能最优。

实现步骤

  1. 安装CloudWatch SDK包:
Install-Package AWSSDK.CloudWatch
  1. 编写指标获取代码:
using Amazon.CloudWatch;
using Amazon.CloudWatch.Model;

public async Task<long> GetS3BucketApproximateSizeAsync(string bucketName)
{
    var cloudWatchClient = new AmazonCloudWatchClient();

    var request = new GetMetricStatisticsRequest
    {
        Namespace = "AWS/S3",
        MetricName = "BucketSizeBytes",
        Dimensions = new List<Dimension>
        {
            new Dimension { Name = "BucketName", Value = bucketName },
            new Dimension { Name = "StorageType", Value = "StandardStorage" }
            // 若桶使用多种存储类型(如Glacier),需单独请求对应类型后求和
        },
        StartTime = DateTime.UtcNow.AddDays(-1),
        EndTime = DateTime.UtcNow,
        Period = 86400, // 取24小时周期的统计值
        Statistics = new List<string> { "Average" }
    };

    var response = await cloudWatchClient.GetMetricStatisticsAsync(request);

    return response.Datapoints.Max(dp => dp.Average).Value;
}

注意事项

  • 数据延迟:指标通常滞后24小时,无法获取实时大小
  • 存储类型:需匹配桶实际使用的存储类型,多类型需分别计算后求和
  • 权限要求:需给IAM实体授予cloudwatch:GetMetricStatistics权限

补充说明

S3是对象存储服务,不存在"已分配空间"的概念,存储桶的总大小即为所有对象已使用空间的总和。

内容的提问来源于stack exchange,提问作者Rakesh Thakre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:30:55