【AWS-CLI】S3のバケット毎の容量とファイル数を取得する

S3は保存してくだけで料金を取られるので、余分なファイルは削除したい。

管理するためにもS3のバケット毎の容量とファイル数を取得する。

awkで高速化をしているので読みづらいが、AWS-CLIのプロファイルを設定すればそのまま使える。

結果は「バケット名 : ファイル数 容量」を容量が多い順に表示、最後に合計の容量を計算してくれる。

#AWSのプロファイル
PROFILE=

#日本語文字化け対応
export PYTHONIOENCODING=UTF-8

#バケット名取得
BUCKET_NAME_LIST=`aws s3 ls --profile ${PROFILE} | sed -E 's/[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} //g'`

#CloudWatchからS3のバケット毎の容量とオブジェクト数を取得
start_time=`date -d "1 day ago" "+%Y-%m-%dT00:00:00Z"`
end_time=`date "+%Y-%m-%dT00:00:00Z"`
period=86400 #1日

cmd='
{
"aws cloudwatch get-metric-statistics --profile '${PROFILE}' --output json --namespace AWS/S3 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value="$1" Name=StorageType,Value=StandardStorage --statistics Sum --start-time '${start_time}' --end-time '${end_time}' --period '${period}' | jq -r \".Datapoints[].Sum\"" | getline SIZE;

"aws cloudwatch get-metric-statistics --profile '${PROFILE}' --output json --namespace AWS/S3 --metric-name NumberOfObjects --dimensions Name=BucketName,Value="$1" Name=StorageType,Value=AllStorageTypes --statistic Sum --start-time '${start_time}' --end-time '${end_time}' --period '${period}' | jq -r \".Datapoints[].Sum\"" | getline NUM;

printf("%s %s %s\n", SIZE, NUM, $1);
}
'

RES=`echo "${BUCKET_NAME_LIST}" | awk "${cmd}" | sort -k 1nr`

cmd='{
SUM+=$1;
if($1 < 1024) printf("%s : %s [files] %s [Byte]\n", $3, $2, $1);
else if($1 >= 1024 && $1 < 1024*1024) printf("%s : %s [files] %.2f [KB]\n", $3, $2, $1/(1024));
else if($1 >= 1024*1024 && $1 < 1024*1024*1024) printf("%s : %s [files] %.2f [MB]\n", $3, $2, $1/(1024*2014));
else if($1 >= 1024*1024*1024) printf("%s : %s [files] %.2f [GB]\n", $3, $2, $1/(1024*1024*1024));
}
END{printf("\nTotal Size: %s [GB]\n",SUM/(1024*1024*1024))}
'

echo "${RES}" | awk "${cmd}"