如何使用.NET获取AWS S3存储桶总大小及空间使用情况
.NET 高效获取AWS S3存储桶总大小方案
AWS S3本身没有直接返回桶总大小的单API,但可以通过以下两种高效方案实现需求,无需手动逐个文件计算,同时无需设置存储桶公开访问(强烈建议关闭公开配置,通过IAM权限控制访问即可)。
实时准确计算(批量枚举对象)
通过AWS SDK for .NET的批量分页接口获取对象列表,批量累加大小,相比逐个请求效率提升数倍,结果实时准确。
实现步骤
- 安装AWS S3 SDK包:
Install-Package AWSSDK.S3
- 编写批量计算代码:
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预计算的存储桶大小指标,无需枚举任何对象,性能最优。
实现步骤
- 安装CloudWatch SDK包:
Install-Package AWSSDK.CloudWatch
- 编写指标获取代码:
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
相关产品推荐
相关产品推荐

