我有多个AWS帐户,我需要列出每个帐户的所有S3存储桶,然后查看每个存储桶的总大小。

当前,我只能通过以下方式查看单个S3存储桶的存储大小:

aws s3 ls s3://mybucket --recursive --human-readable --summarize


评论

S3 Select于几天前在re:invent 2017中发布twitch.tv/videos/206752912

您可能想要尝试我编写的这段代码来自己实现相同的目的:github.com/insperitas/s3-data

#1 楼

解决方案1 ​​

所以我用以下脚本解决了这个问题。我最初发布了该问题,以防万一我不知道有一种更简便的方法。

#!/bin/bash
aws_profile=('profile1' 'profile2' 'profile3');

#loop AWS profiles
for i in "${aws_profile[@]}"; do
  echo "${i}"
  buckets=($(aws --profile "${i}" --region your_region s3 ls s3:// --recursive | awk '{print }'))

  #loop S3 buckets
  for j in "${buckets[@]}"; do
  echo "${j}"
  aws --profile "${i}" --region your_region s3 ls s3://"${j}" --recursive --human-readable --summarize | awk END'{print}'
  done

done


解决方案2

在仪表板中使用AWS控制台中的CloudWatch。

然后您只需指定所有S3存储桶并添加数字统计信息即可显示存储大小指标。调用API的速度可能会更快,具体取决于s3存储桶的大小(要花很长时间才能获得非常大的存储桶的大小)。

判决

在每个AWS账户上创建仪表盘(解决方案2)对我来说是最有效的选择,因为它可以更快地手动登录并获取指标而不是等待脚本API调用完成。 :(

评论


为什么awk END'{print}'吗?

–滕西拜
17-10-4在14:57

使用递归选项可以显示每个文件夹和文件的大小,而我只需要存储桶总大小的输出即可。

–凯尔·斯汀坎普(Kyle Steenkamp)
17-10-4在15:08

您需要选择“ 1天”或更长的时间以使仪表板显示任何内容

–莱比锡(Jeremy Leipzig)
18年7月16日在17:38

请注意,解决方案2中提出的解决方案会增加Cloudwatch的成本,因为目前每个仪表盘的成本为3美元。 aws.amazon.com/cloudwatch/pricing/?nc1=h_ls

–德鲁比奥
19 Mar 6 '19 at 17:52

“ $ {buckets [@]}”中的[@]是什么意思?

–乔
20 Mar 21 '20 at 20:14

#2 楼

您将需要编写一个脚本来解析和查询此数据,因为据我所知,没有工具或cli函数可以执行此操作。幸运的是,您可以使用CLI收集所有这些信息。



列出并解析组织中的所有帐户。

aws organizations list-accounts



对于每个帐户,列出并分析所有存储桶。

aws s3api list-buckets --query "Buckets[].Name"



最后,获取每个帐户中每个存储桶的大小。您可以使用以前的cli命令,但是要注意,您将要列出存储桶中每个项目的单独大小。您还可以使用此cli命令获取存储区大小。

aws s3api list-objects --bucket BUCKETNAME --output json --query "
[sum(Contents[].Size), length(Contents[])]"




评论


1.不列出AWS账户的配置文件信息。我没有时间从存储此信息的aws配置文件中对它进行正则表达式,因此我只是在下面发布的脚本中对值进行了硬编码

–凯尔·斯汀坎普(Kyle Steenkamp)
17-10-4在14:44

#3 楼

除非有一个我找不到的工具,否则您将必须编写脚本来执行此操作。

如果您使用多个AWS帐户,则需要在帐户之间进行切换以获取存储桶大小。

要获取所有存储桶及其总大小,可以使用“ aws s3api”。使用list-buckets,您可以在一个帐户中获取所有存储桶,然后可以列出其大小并尝试下一个帐户。

评论


我使用boto3编写了一个Python脚本来执行此操作:gist.github.com/rwiggins/b945b5ec1693c1d473a814915adcee8c(注意:使用CloudWatch的GetMetricStatistics可以有效地提取存储桶大小,而无需对存储桶中的所有对象大小求和)

–里德
19年7月16日在20:15



#4 楼

如果启用了版本控制并且已“删除”了大量数据,则这些都不显示存储桶的大小。在S3 GUI控制台中,“度量标准”选项卡显示了要向您收费的内容。我得到了亚马逊S3桶的大小。它在Windows上运行良好。用yourregionyourbucketname代替:

aws cloudwatch get-metric-statistics --namespace AWS/S3 --start-time 2019-05-09T00:01:00Z --end-time 2019-05-11T23:59:00Z --period 86400 --statistics Average --region yourregion --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=yourbucketname Name=StorageType,Value=StandardStorage

这给出了以开始和结束时间为界的天的平均大小(以字节为单位)。如果您的存储桶启用了“版本控制”(处于活动状态)并且您认为自己已“删除”了大量数据,结果将使您感到震惊。您可以选择永久删除以前的版本。您可以在“转换”步骤中忽略该复选框。