概要
- S3コンソールの「バケットを空にする」機能がCLIやSDKではしづらい
- バージョニングがオフならCLIだと
aws s3 rm --recursive
で可能だが、速度が遅い - バージョニングがオンだとそもそもできない(やろうとすると面倒で大変)
- バージョニングがオフならCLIだと
- S3バケットを削除する際、バケットが空でないと削除できない
- CLIでは
aws s3 rb --force
で可能だが、速度が遅い
- CLIでは
- 空にしたいが他リソースから依存されていて、CDKの
autoDeleteObjects
などでバケット削除+再作成が出来ない - S3のライフサイクル機能で消そうとしても1日待たないといけない
- とにかく、大量のオブジェクトを早急に削除したい
そんなむず痒さを解消するためのツールをOSSで公開しました。
とても楽に、高速にバケットを空にしたり、バケットごと削除したりできるようになりました。
しかも、複数バケットを(検索しつつ)一括でできます!
目次
ツール名
「cls3」としました。(短い方が打ちやすいため)
読み方はわかりません。。。「シーエルエススリー」としました。「clear S3」から省略しました。
ソースコード
Go言語で実装しています。
スターなど頂けると泣いて喜びます(本当モチベーションが上がるのです…!)
特徴
「空にする」も「バケットごと削除」も
最初は「バケットを空にする」ことを目的としたツールだったのですが、せっかくなので「バケットも一緒に削除する」オプション(-f|--force
)もつけました。
バケット名検索・複数バケット削除
後述しますが、バケット名を検索したり、複数のバケットを一括で削除または空にすることができます。
リージョン跨ぎ
複数バケット削除において、複数のリージョンのバケットの場合でも一括で削除することができます。
※S3 Express One Zoneのための ディレクトリバケット モード (-d
オプション)ではリージョンをまたいだ操作はできず、1つのリージョン でのみの操作になります。リージョンは -r
オプションで指定できます。
バージョニングが有効なバケット削除
バージョニングをオンにしている場合でも、オフのときと同じようにバケットを空にしたり削除したりできます。そのため、バージョニング設定を意識せずに使えます。
非現行バージョンのオブジェクトのみ削除
-o | --oldVersionsOnly
オプションを使うと、新しいバージョンやバケット自体を削除せずに、古いバージョンのオブジェクトとすべての削除マーカーだけを削除することができます。
つまり、最新バージョンのオブジェクトだけを残すことができます。
このオプションは -f | --force
オプションと一緒に指定することはできません。
S3 Express One Zoneのディレクトリバケット削除
d | --directoryBucketsMode
オプションを使用すると、S3 Express One Zone用のディレクトリバケットを削除できます。
このモードでは、S3 Express One Zoneのディレクトリバケットの仕様上リージョンをまたいだ操作はできず、1つのリージョン内でのみの操作になります。そのため、リージョンを -r
オプションで指定してください。
削除できるオブジェクト数の制限無し
CLI, SDKで提供されるdelete-objects APIは、「1コマンドで削除できるオブジェクトの数が1000個まで」という制限がありますが、このツールでは数の制限はありません。
大量のオブジェクト削除にも是非。
503エラー時のリトライ
オブジェクトが何万件もある場合、通常CLIやSDKで一気に削除しているとまれに S3 api側でSlowDownエラー(503エラー)が起こることがあります。
これが起きた場合cls3では、数秒待って何度か自動リトライする仕組みを入れることで対応しています。
使い方
インストール
Homebrew
brew install go-to-k/tap/cls3
Linux / Darwin (macOS) / Windows
curl -fsSL https://raw.githubusercontent.com/go-to-k/cls3/main/install.sh | sh cls3 -h # To install a specific version of cls3 # e.g. version 0.13.2 curl -fsSL https://raw.githubusercontent.com/go-to-k/cls3/main/install.sh | sh -s "v0.13.2" cls3 -h
aqua
aqua g -i go-to-k/cls3
バイナリ
ソースビルド(開発版)
※Go環境が必要です。
git clone https://github.com/go-to-k/cls3.git cd cls3 make install
実行方法
cls3 -b <bucketName> [-b <bucketName>] [-p <profile>] [-r <region>] [-f|--force] [-i|--interactive] [-o|--oldVersionsOnly] [-q|--quietMode] [-d|--directoryBucketsMode]
オプション
- -b, --bucketName
- -p, --profile(オプション)
- AWSプロファイル名
- (デフォルト: 実行環境のデフォルトのプロファイルが使用されます)
- -r, --region(オプション)
- -f, --force(オプション)
- S3バケットごと削除する
- -i, --interactive(オプション)
- 対話モード(バケット名検索用)
- -o, --oldVersionsOnly(オプション)
- 非現行バージョンのオブジェクトと削除マーカーのみを全て削除する
- 新しいバージョンのオブジェクトのみをS3バケットに残すことができます
- バージョニングがオンからオフに変更した状態でも問題なく実行できます
-f
オプションと一緒には使えません
- 非現行バージョンのオブジェクトと削除マーカーのみを全て削除する
- -q, --quietMode(オプション)
- 削除数のリアルタイム表示をしません
- CI環境などでリアルタイム削除数の表示は不要な場合におすすめです
- -d, --directoryBucketsMode(オプション)
対話モード
バケット名検索
-i
オプションで対話モードになり、キーワードで検索し、複数または単一のバケットを削除または空にできます。
リージョン横断での検索・削除ができるようにしているため、リージョンを意識しないで使用できます。
空でも大丈夫です。(全バケットが出力されます)
❯ cls3 -i
Filter a keyword of bucket names: test-goto
そして、出力されたバケットの中から削除または空にしたいバケットを選択します。
? Select buckets. [Use arrows to move, space to select, <right> to all, <left> to none, type to filter] > [x] test-goto-bucket-1 [ ] test-goto-bucket-2 [x] test-goto-bucket-3
GitHub Actions
GitHub Actionsのカスタムアクションとして、cls3のアクションを提供しています。ぜひGitHub Actionsでcls3を使ってみてください。
quiet
は削除数のリアルタイム表示をしないためのオプションですが、CIではリアルタイム表示は不要なケースが多いため、GitHub Actionsではデフォルトでtrueにしています。(普段CLIとして使う際はfalse)
基本的にはリージョンをまたいだバケットの削除をすることができるので、region
を指定する必要はありません。ただし、S3 Express One Zoneのディレクトリバケットモード(directory-buckets-mode
)を指定する場合、このモードはリージョンをまたいだ削除をすることはできないため、リージョンの指定が必要です。
また、複数バケット削除をする場合は、カンマ区切りで指定可能です。(bucket-name: YourBucket1, YourBucket2, YourBucket3
)
jobs: cls3: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v3 with: role-to-assume: arn:aws:iam::123456789100:role/my-github-actions-role # Or specify access keys. # aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} # aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: us-east-1 - name: Delete bucket uses: go-to-k/cls3@main # Or specify the version instead of main with: bucket-name: YourBucket # bucket-name: YourBucket1, YourBucket2, YourBucket3 # To delete multiple buckets force: true # Whether to delete the bucket itself, not just the object (default: false) quiet: false # Hide live display of number of deletions (default: true in GitHub Actions ONLY.) old-versions-only: false # Delete old version objects only (including all delete-markers) (default: false) directory-buckets-mode: false # Directory Buckets Mode for S3 Express One Zone (default: false) region: us-east-1 # Specify the region in the Directory Buckets Mode for S3 Express One Zone
また、cls3のバイナリファイルをインストールした後に、自由にコマンドとして叩くことも可能です。
jobs: cls3: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v3 with: role-to-assume: arn:aws:iam::123456789100:role/my-github-actions-role # Or specify access keys. # aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} # aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: us-east-1 - name: Install cls3 uses: go-to-k/cls3@main # Or specify the version instead of main - name: Run cls3 run: | echo "cls3" cls3 -v cls3 -b YourBucket1 -b YourBucket2