はじめに

S3 のストレージ量を調査したい場合に、容量一覧をサクッと出せる方法が実はないことに気づきました。これは自分で作るしかないと考え、 OSS 化して公開しましたので、使い方を紹介します。

S3 size checker CLI. Contribute to nekrassov01/s3bytes development by creating an account on GitHub.

どんなツールか

容量一覧を出すだけなのでたいしたツールではないのですが、使いやすくなるようにいろいろと工夫しています。

  • なるべく高速に動作させる
  • 再利用性を考え、様々なアウトプット形式を用意する
  • バケット名と容量でフィルタできるようにする
  • シンプルなコマンドライン体系にする

ストレージ容量の収集には CloudWatch メトリクスの AWS/S3 ネームスペースを利用しています。直近のメトリクスを収集して、見やすく加工して返しているだけです。収集できるメトリックやストレージタイプは以下ドキュメントに沿っています。

Learn about the storage metrics and dimensions that Amazon S3 sends to Amazon CloudWatch.

インストール

Mac であれば homebrew でインストールできます。

brew install nekrassov01/tap/s3bytes

Windows, Linux の場合はリリースページからバイナリをダウンロードしてください。シングルバイナリなので置くだけで動きます。

オプション

s3bytes はひとつのことしかできないので、サブコマンドはありません。オプションは以下の通りです。各オプションがどのような値を期待しているかを示しています。

オプション デフォルト値 環境変数
–completion value
-c value
bash
zsh
pwsh
–profile value
-p value
任意 AWS_PROFILE
–log-level value
-l value
debug
info
warn
error
info S3BYTES_LOG_LEVEL
–region v1,v2
-r v1,v2
af-south-1
ap-east-1
ap-northeast-1
ap-northeast-2
ap-northeast-3
ap-south-1
ap-south-2
ap-southeast-1
ap-southeast-2
ap-southeast-3
ap-southeast-4
ap-southeast-5
ap-southeast-7
ca-central-1
ca-west-1
eu-central-1
eu-central-2
eu-north-1
eu-south-1
eu-south-2
eu-west-1
eu-west-2
eu-west-3
il-central-1
me-central-1
me-south-1
mx-central-1
sa-east-1
us-east-1
us-east-2
us-west-1
us-west-2
All regions with no opt-in
–prefix value
-P value
任意
–filter value
-f value
> value
>= value
< value
<= value
== value
!= value
–metric-name value
-m value
BucketSizeBytes
NumberOfObjects
BucketSizeBytes
–storage-type value
-s value
StandardStorage
IntelligentTieringFAStorage
IntelligentTieringIAStorage
IntelligentTieringAAStorage
IntelligentTieringAIAStorage
IntelligentTieringDAAStorage
StandardIAStorage
StandardIASizeOverhead
StandardIAObjectOverhead
OneZoneIAStorage
OneZoneIASizeOverhead
ReducedRedundancyStorage
GlacierIRSizeOverhead
GlacierInstantRetrievalStorage
GlacierStorage
GlacierStagingStorage
GlacierObjectOverhead
GlacierS3ObjectOverhead
DeepArchiveStorage
DeepArchiveObjectOverhead
DeepArchiveS3ObjectOverhead
DeepArchiveStagingStorage
AllStorageTypes
StandardStorage
–output value
-o value
json
prettyjson
text
compressedtext
markdown
backlog
tsv
chart
compressedtext S3BYTES_OUTPUT_TYPE
–help
-h
–version
-v

基本的な使い方

特にオプションを指定しなければ、以下のような ASCII テーブルで表示されます。最後のログ行に合計を表示しています。ストレージタイプを選択できますが、デフォルト値は StandardStorage です。

$ s3bytes
INF S3BYTES: started at=2025-02-14T18:27:43+09:00 metricName=BucketSizeBytes storageType=StandardStorage output=compressedtext
+-------------------------+----------------+-----------------+-----------------+-------------+
| BucketName              | Region         | MetricName      | StorageType     | Value       |
+-------------------------+----------------+-----------------+-----------------+-------------+
| bucket-ap-northeast-1-1 | ap-northeast-1 | BucketSizeBytes | StandardStorage | 48650507822 |
| bucket-ap-northeast-1-2 | ap-northeast-1 | BucketSizeBytes | StandardStorage | 22324290470 |
| bucket-us-east-1-1      | us-east-1      | BucketSizeBytes | StandardStorage | 11437162489 |
| bucket-us-east-1-2      | us-east-1      | BucketSizeBytes | StandardStorage |  4357954340 |
| bucket-us-east-1-3      | us-east-1      | BucketSizeBytes | StandardStorage |  2161467716 |
| bucket-us-east-1-4      | us-east-1      | BucketSizeBytes | StandardStorage |  1007874244 |
| bucket-ap-northeast-1-3 | ap-northeast-1 | BucketSizeBytes | StandardStorage |   954199226 |
| bucket-ap-northeast-1-4 | ap-northeast-1 | BucketSizeBytes | StandardStorage |   819020407 |
| bucket-us-west-2-1      | us-west-2      | BucketSizeBytes | StandardStorage |   737521150 |
| bucket-ap-northeast-1-5 | ap-northeast-1 | BucketSizeBytes | StandardStorage |   677619987 |
...
INF S3BYTES: stopped total=97,374,713,694

ストレージ容量のほかにオブジェクト数を得ることもできます。--metric-nameNumberOfObjects を、--storage-typeAllStorageTypes を渡します。

$ s3bytes --metric-name NumberOfObjects --storage-type AllStorageTypes
INF S3BYTES: started at=2025-02-15T22:55:29+09:00 metricName=NumberOfObjects storageType=AllStorageTypes output=compressedtext
+-------------------------+----------------+-----------------+-----------------+----------+
| BucketName              | Region         | MetricName      | StorageType     | Value    |
+-------------------------+----------------+-----------------+-----------------+----------+
| bucket-us-west-2-1      | us-west-2      | NumberOfObjects | AllStorageTypes | 26863722 |
| bucket-ap-northeast-1-1 | ap-northeast-1 | NumberOfObjects | AllStorageTypes | 26693330 |
| bucket-ap-northeast-1-2 | ap-northeast-1 | NumberOfObjects | AllStorageTypes |  5053813 |
| bucket-us-west-2-2      | us-west-2      | NumberOfObjects | AllStorageTypes |  4363409 |
| bucket-ap-northeast-1-3 | ap-northeast-1 | NumberOfObjects | AllStorageTypes |  1443456 |
| bucket-ap-northeast-1-4 | ap-northeast-1 | NumberOfObjects | AllStorageTypes |  1139222 |
| bucket-us-west-2-3      | us-west-2      | NumberOfObjects | AllStorageTypes |  1139222 |
| bucket-us-west-2-4      | us-west-2      | NumberOfObjects | AllStorageTypes |   960774 |
| bucket-us-west-2-5      | us-west-2      | NumberOfObjects | AllStorageTypes |   829021 |
| bucket-ap-northeast-1-5 | ap-northeast-1 | NumberOfObjects | AllStorageTypes |   782870 |
...
INF S3BYTES: stopped total=73,767,829

フィルタリング

以下のオプションを組み合わせることでフィルタリングできます。

オプション 動作
prefix ListBuckets API ネイティブの Prefix パラメータを使う
バケット一覧を取得する際にフィルタリングする
filter GetMetricData API で取得したメトリクスの Value に対して比較オペレータを使って絞り込む
‘> 100’ など容量に対する式評価でフィルタリングする

例えば kawashima から始まるバケット名で容量が 5GB 以上のバケット一覧が欲しい場合は以下のようにします。

s3bytes --prefix kawashima --filter '>= 5368709120'

# 別解
v=$((5*1024*1024*1024)) s3bytes --prefix kawashima --filter ">= $v"

アウトプット形式

多様なアウトプット形式を用意しています。--output に以下のいずれかを指定してください。

オプションに渡す文字列 用途
json ログに出したいとき、他のコマンドに標準入力として渡したいとき
prettyjson 整形された JSON がほしいとき
text 標準出力でそのまま確認したいとき (行線あり)
compressedtext 標準出力でそのまま確認したいとき (行線なし)
markdown マークダウンのドキュメントにそのまま貼りたいとき
backlog Backlog のドキュメントにそのまま貼りたいとき
tsv スプレッドシートにそのまま貼りたいとき
chart 視覚的にざっくり把握したいとき

ほとんどはテキスト表現を返しますが、最後の chart だけは視覚的なアウトプットとなっており、容量一覧を円グラフにプロットします。HTML ファイルが作成され、そのままブラウザで表示されます。

chart

注意点

s3bytes は内部的に GetMetricData API を使っています。この API は 1 回のリクエストで 500 個までメトリクスを指定できるため、次のような実装になっています。

  • パラメーターとして渡す MetricDataQueries にバケット名をひとつずつ詰めていき、500 に到達したら実行
  • まだバケットが残っていたら 2 ショット目の MetricDataQueries を準備
  • 全バケット分繰り返す

これだけならいいのですが、料金表にも書かれている通り、この API はリクエストごとではなくメトリクスごとに課金されます。東京リージョンの場合、1,000 メトリクスにつき 0.01 USD かかります。バケットがアカウント全体で 1,000 個あるとしたら、コマンドを実行するたびに 0.01 USD 課金されることになります。この点にはくれぐれもご注意ください (とはいえ ¥2 以下なので、手動実行で問題になることは少ないはずです)

おわりに

こういったちょっとしたツールでも、手元で簡単に実行できるようにしておくと、いざ調査が必要になった時に即座に実行でき、作業が捗ります。別記事で紹介した llcm と合わせて、ぜひ使ってみてください。