S3バケットのオブジェクト数をawscliで確認
S3バケットにあるオブジェクトの数をawscliで確認する方法です。
2つ方法を書きます。1つ目は単純にlsコマンドで数えています。2つ目はCloudWatchのMetricsで、バージョニングが有効化されているバケットの場合は過去バージョンのオブジェクトも含まれます。
aws s3 lsコマンド
aws s3 ls
コマンドに --recursive --sum
を付けると最後にオブジェクト数とデータサイズが表示されます。
$ aws s3 ls --recursive --sum BUCKET_NAME ... Total Objects: 16849 Total Size: 41267890
ずらっと表示されるのが嫌なら tail
コマンドを後ろに付けます。
$ aws s3 ls --recursive --sum BUCKET_NAME | tail -n2 Total Objects: 16849 Total Size: 41267890
データサイズがいらないのであれば、wc
でもよいです。
$ aws s3 ls --recursive BUCKET_NAME | wc -l 16849
いずれもオブジェクトの一覧を出力して数を数えているだけです。オブジェクト数が膨大な場合は、数えるのに時間がかかりますし、API呼び出し回数も膨大になるので、お金もかかります。
昔似たことを書いてました。
aws cloudwatch get-metric-dataコマンド
CloudWatchのMetricsであれば、オブジェクト数が膨大でも問題ありませんが、現在ではなく、最新でも前日のたぶん朝9時ごろ時点での数しかわからないです。それに、コマンドがとても長いです。実行する際には以下のコマンド例から BUCKET_NAME
の部分を探して置き換えてください。
$ aws cloudwatch get-metric-data --metric-data-queries '[{"Id":"objectCount","MetricStat":{"Metric":{"Namespace":"AWS/S3","MetricName":"NumberOfObjects","Dimensions":[{"Name":"StorageType","Value":"AllStorageTypes"},{"Name":"BucketName","Value":"BUCKET_NAME"}]},"Period":86400,"Stat":"Maximum"}}]' --start-time $(date -u +%Y-%m-%dT00:00:00Z -d "1 day ago") --end-time $(date -u +%Y-%m-%dT00:00:00Z) | jq '.MetricDataResults[0] | {Timestamp: .Timestamps[0], Value: .Values[0]}'
以下のような出力を得られます。
{ "MetricDataResults": [ { "Id": "objectCount", "Label": "NumberOfObjects", "Timestamps": [ "2021-02-13T00:00:00Z" ], "Values": [ 16849.0 ], "StatusCode": "Complete" } ], "Messages": [] }
スクリプト化したほうがいいかも。
profile=default bucket_name=BUCKET_NAME aws --profile $profile cloudwatch get-metric-data --metric-data-queries '[{ "Id":"objectCount", "MetricStat":{ "Metric":{ "Namespace":"AWS/S3", "MetricName":"NumberOfObjects", "Dimensions":[ {"Name":"StorageType","Value":"AllStorageTypes"}, {"Name":"BucketName","Value":"'$bucket_name'"} ] }, "Period":86400, "Stat":"Maximum" } }]' \ --start-time $(date -u +%Y-%m-%dT00:00:00Z -d "1 day ago") \ --end-time $(date -u +%Y-%m-%dT00:00:00Z) | jq '.MetricDataResults[0] | {Timestamp: .Timestamps[0], Value: .Values[0]}'
最後にjqを付けることで、出力を少し簡潔にしています。
{ "Timestamp": "2021-02-13T00:00:00Z", "Value": 16849 }
S3バケットのバージョニングが有効化されている場合、CloudWatchで得られるオブジェクト数は過去バージョンも含めた数になります。
参考
バージョン情報
$ aws --version aws-cli/1.18.209 Python/3.8.5 Linux/5.4.0-1036-gcp botocore/1.19.49