はじめに
S3 のストレージ量を調査したい場合に、容量一覧をサクッと出せる方法が実はないことに気づきました。これは自分で作るしかないと考え、 OSS 化して公開しましたので、使い方を紹介します。
どんなツールか
容量一覧を出すだけなのでたいしたツールではないのですが、使いやすくなるようにいろいろと工夫しています。
- なるべく高速に動作させる
- 再利用性を考え、様々なアウトプット形式を用意する
- バケット名と容量でフィルタできるようにする
- シンプルなコマンドライン体系にする
ストレージ容量の収集には CloudWatch メトリクスの AWS/S3 ネームスペースを利用しています。直近のメトリクスを収集して、見やすく加工して返しているだけです。収集できるメトリックやストレージタイプは以下ドキュメントに沿っています。
インストール
Mac であれば homebrew でインストールできます。
brew install nekrassov01/tap/s3bytes
Windows, Linux の場合はリリースページからバイナリをダウンロードしてください。シングルバイナリなので置くだけで動きます。
オプション
s3bytes はひとつのことしかできないので、サブコマンドはありません。オプションは以下の通りです。各オプションがどのような値を期待しているかを示しています。
| オプション | 値 | デフォルト値 | 環境変数 |
|---|---|---|---|
| –completion value -c value |
bashzshpwsh |
– | – |
| –profile value -p value |
任意 | – | AWS_PROFILE |
| –log-level value -l value |
debuginfowarnerror |
info |
S3BYTES_LOG_LEVEL |
| –region v1,v2 -r v1,v2 |
af-south-1ap-east-1ap-northeast-1ap-northeast-2ap-northeast-3ap-south-1ap-south-2ap-southeast-1ap-southeast-2ap-southeast-3ap-southeast-4ap-southeast-5ap-southeast-7ca-central-1ca-west-1eu-central-1eu-central-2eu-north-1eu-south-1eu-south-2eu-west-1eu-west-2eu-west-3il-central-1me-central-1me-south-1mx-central-1sa-east-1us-east-1us-east-2us-west-1us-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 |
BucketSizeBytesNumberOfObjects |
BucketSizeBytes |
– |
| –storage-type value -s value |
StandardStorageIntelligentTieringFAStorageIntelligentTieringIAStorageIntelligentTieringAAStorageIntelligentTieringAIAStorageIntelligentTieringDAAStorageStandardIAStorageStandardIASizeOverheadStandardIAObjectOverheadOneZoneIAStorageOneZoneIASizeOverheadReducedRedundancyStorageGlacierIRSizeOverheadGlacierInstantRetrievalStorageGlacierStorageGlacierStagingStorageGlacierObjectOverheadGlacierS3ObjectOverheadDeepArchiveStorageDeepArchiveObjectOverheadDeepArchiveS3ObjectOverheadDeepArchiveStagingStorageAllStorageTypes |
StandardStorage |
– |
| –output value -o value |
jsonprettyjsontextcompressedtextmarkdownbacklogtsvchart |
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-name に NumberOfObjects を、--storage-type に AllStorageTypes を渡します。
$ 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 ファイルが作成され、そのままブラウザで表示されます。
注意点
s3bytes は内部的に GetMetricData API を使っています。この API は 1 回のリクエストで 500 個までメトリクスを指定できるため、次のような実装になっています。
- パラメーターとして渡す
MetricDataQueriesにバケット名をひとつずつ詰めていき、500 に到達したら実行 - まだバケットが残っていたら 2 ショット目の
MetricDataQueriesを準備 - 全バケット分繰り返す
これだけならいいのですが、料金表にも書かれている通り、この API はリクエストごとではなくメトリクスごとに課金されます。東京リージョンの場合、1,000 メトリクスにつき 0.01 USD かかります。バケットがアカウント全体で 1,000 個あるとしたら、コマンドを実行するたびに 0.01 USD 課金されることになります。この点にはくれぐれもご注意ください (とはいえ ¥2 以下なので、手動実行で問題になることは少ないはずです)
おわりに
こういったちょっとしたツールでも、手元で簡単に実行できるようにしておくと、いざ調査が必要になった時に即座に実行でき、作業が捗ります。別記事で紹介した llcm と合わせて、ぜひ使ってみてください。
