はじめに
S3 のストレージ量を調査したい場合に、容量一覧をサクッと出せる方法が実はないことに気づきました。これは自分で作るしかないと考え、 OSS 化して公開しましたので、使い方を紹介します。
どんなツールか
容量一覧を出すだけなのでたいしたツールではないのですが、使いやすくなるようにいろいろと工夫しています。
- なるべく高速に動作させる
- 再利用性を考え、様々なアウトプット形式を用意する
- バケット名と容量でフィルタできるようにする
- シンプルなコマンドライン体系にする
ストレージ容量の収集には CloudWatch メトリクスの AWS/S3
ネームスペースを利用しています。直近のメトリクスを収集して、見やすく加工して返しているだけです。収集できるメトリックやストレージタイプは以下ドキュメントに沿っています。
インストール
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-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 と合わせて、ぜひ使ってみてください。