我的任务是提供一个api端点,以了解特定模块在我们的Amazon s3存储桶中使用了多少空间。我正在使用C#SDK。
我是通过改编https://docs.aws.amazon.com/AmazonS3/latest/dev/ListingObjectKeysUsingNetSDK.html
中的代码来实现的 private long GetUsedBytes(string module, string customer)
{
ListObjectsRequest listRequest = new ListObjectsRequest()
{
BucketName = BucketName,
Prefix = module + "/" + customer
};
ListObjectsResponse listResponse;
long totalSize = 0;
do
{
listResponse = s3Client.ListObjects(listRequest);
foreach (S3Object obj in listResponse.S3Objects)
{
totalSize += obj.Size;
}
listRequest.Marker = listResponse.NextMarker;
} while (listResponse.IsTruncated);
return totalSize;
}
我的问题是:有没有办法使用sdk 做到这一点而又不会从桶中拉出所有实际的s3object?关于使用CLI进行操作,有几个很好的答案:
AWS S3: how do I see how much disk space is using https://serverfault.com/questions/84815/how-can-i-get-the-size-of-an-amazon-s3-bucket
但是我还不能直接使用SDK找到一个。我是否必须以某种方式模仿sdk才能做到这一点?我考虑的另一种方法是获取所有键并查询其元数据,但是获取我发现的所有键的唯一方法是获取所有对象,如^上方的链接中所示。如果有一种方法可以获取具有特定前缀的对象的所有元数据,那将是理想的选择。
感谢您的时间!
〜乔什
答案 0 :(得分:0)
您的代码不是 从Amazon S3下载任何对象。它仅调用ListObjects()
并总计每个对象的大小。每1000个对象将进行一次API调用。
或者,您可以从Amazon CloudWatch检索每个存储桶的大小。
来自Monitoring Metrics with Amazon CloudWatch - Amazon S3:
指标:
BucketSizeBytes
存储在存储桶中的数据量(以字节为单位)。该值是通过将存储桶中所有对象(当前对象和非当前对象)的大小相加得出的,包括所有不完整的分段上传到存储桶的所有部分的大小。
因此,只需从Amazon CloudWatch检索指标,而不是自己计算。