概要
- S3バケットを空にするボタンがS3コンソールにはあるのにCLIやSDKでは存在しない
- S3バケットを削除する際、バケットが空でないと削除できない
- CLIでは
aws s3 rb --force
で可能ですが
- CLIでは
- 他リソースから依存されていてバケット削除+再作成が出来ない
- S3のライフサイクル機能で消そうとしても1日待たないといけない
そんなむず痒さを解消するため作って、OSSで公開しました。
目次
ツール名
「cls3」としました。(短い方が打ちやすいため)
読み方はわかりません。。。「clear S3」から省略しました。
ソースコード
Go言語で実装しています。
根本のS3バケットへの操作部分は、先日公開したCloudFormationスタック強制削除ツール「delstack」のコードをimportしています。
そのため、このツールのコード自体はかなりシンプルに仕上がっています。
特徴
バージョニング
バージョニングをオンにしている場合でも、オフのときと同じように空にできます。そのため、バージョニング設定を意識せずに使えます。
バケット削除オプション
「バケットを空にする」ことを目的としたツールですが、せっかくなので「バケットも一緒に削除する」オプション(-f|--force
)もつけました。
削除できるオブジェクト数
CLI, SDKで提供されるdelete-objects APIは、「1コマンドで削除できるオブジェクトの数が1000個まで」という制限がありますが、このツールでは数の制限はありません。
並列処理
1000個以上オブジェクト・バージョンがある場合は、並列処理(並列数の上限は実行環境の論理CPUコア数)でオブジェクト削除をしています。
これは上記の通りSDKの1 APIで1000個までまとめて削除出来るため、その単位ごとに並列実行しています。
そのため、結構速いです。
試しに同じ1万オブジェクト(サイズは極小)を入れたバケットを2つ用意して、コンソールの「空にする」ボタンと作ったツール(ローカル環境/論理CPUコア数8)それぞれで削除してみたのですが、コンソールでは22秒、本ツールでは6秒で終わりました。
実行の際の微妙な差異はありますが、公式より結構速そうです。
503エラー時のリトライ
オブジェクトが何万件もある場合、通常CLIやSDKで一気に削除しているとまれに S3 api側でSlowDownエラー(503エラー)が起こることがあります。
これが起きた場合cls3では、数秒待って何度か自動リトライする仕組みを入れることで対応しています。
使い方
インストール
Homebrew
brew install go-to-k/tap/cls3
バイナリ
ソースビルド(開発版)
※Go環境が必要です。
git clone https://github.com/go-to-k/cls3.git cd cls3 make install
実行方法
cls3 -b <bucketName> [-p <profile>] [-r <region>] [-f]
オプション
- -b, --bucketName(必須)
- S3バケット名
- -p, --profile(オプション)
- AWSプロファイル名
- (デフォルト: 実行環境のデフォルトのプロファイルが使用されます)
- -r, --region(オプション)
- AWS Region
- (デフォルト:
ap-northeast-1
)
- -f, --force(オプション)
- S3バケットごと削除する
補足
こちらのクラスメソッド様の記事(『AWS CLI を使ってバージョニングが有効化された Amazon S3 バケットを空にしてみた』)を拝見し、触発?インスパイア?されて、自分がもともと作っていたものも公開したら面白いかなと思い書いてみました。
私の方は記事的には二番煎じですが、ツールとしてもOSS公開したのでせっかくなので記事も書いてみた次第です。
※Twitter始めました!
良かったらぜひ。
Twitter ID → @365_step_tech