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