S3バケット高速削除・空にするツール(バージョニング対応)

概要

  • S3コンソールの「バケットを空にする」機能がCLISDKではしづらい
    • バージョニングがオフならCLIだとaws s3 rm --recursiveで可能だが、速度が遅い
    • バージョニングがオンだとそもそもできない(やろうとすると面倒で大変)
  • S3バケットを削除する際、バケットが空でないと削除できない
    • CLIではaws s3 rb --forceで可能だが、速度が遅い
  • 空にしたいが他リソースから依存されていて、CDKのautoDeleteObjectsなどでバケット削除+再作成が出来ない
  • S3のライフサイクル機能で消そうとしても1日待たないといけない


そんなむず痒さを解消するためのツールをOSSで公開しました。

とても楽に、高速にバケットを空にしたり、バケットごと削除したりできるようになりました。

しかも、複数バケットを(検索しつつ)一括でできます!


目次

目次


ツール名

「cls3」としました。(短い方が打ちやすいため)

読み方はわかりません。。。シーエルエススリー」としました。「clear S3」から省略しました。


ソースコード

Go言語で実装しています。

github.com


特徴

バケット削除オプション

最初は「バケットを空にする」ことを目的としたツールだったのですが、せっかくなのでバケットも一緒に削除する」オプション(-f|--force)もつけました。


バケット名検索・複数バケット削除

後述しますが、バケット名を検索したり、複数のバケットを一括で削除または空にすることができます。


リージョン跨ぎ

複数バケット削除において、複数のリージョンのバケットの場合でも一括で削除することができます。


バージョニング

バージョニングをオンにしている場合でも、オフのときと同じように空にできます。そのため、バージョニング設定を意識せずに使えます。


非現行バージョンのみ全て削除

-o | --oldVersionsOnly オプションを使うと、新しいバージョンやバケット自体を削除せずに、古いバージョンのみとすべての削除マーカーを削除することができます。

つまり、最新バージョンのオブジェクトだけを残すことができます。

このオプションは -f | --force オプションと一緒に指定することはできません。


削除できるオブジェクト数

CLI, SDKで提供されるdelete-objects APIは、「1コマンドで削除できるオブジェクトの数が1000個まで」という制限がありますが、このツールでは数の制限はありません


並列処理

1000個以上オブジェクト・バージョンがある場合は、並列処理(並列数の上限は「3並列まで」 ※後述)でオブジェクト削除をしています。

これは上記の通りSDKの1 APIで1000個までまとめて削除出来るため、その単位ごとに並列実行しています。

そのため、結構速いです。


試しに同じ1万オブジェクト(サイズは極小)を入れたバケットを2つ用意して、コンソールの「空にする」ボタンと作ったツール(ローカル環境/論理CPUコア数8)それぞれで削除してみたのですが、コンソールでは22秒、本ツールでは8秒で終わりました。コンソールより3倍速いですね。

また、1000万オブジェクト(バージョン・削除マーカー含む)100分程度 で削除が完了しました。(※動作環境によるので保証は出来ません。)


なぜ「並列数の上限は3並列まで」なのかと言うと、AWSのドキュメントに以下のような旨が書いてありました。

For example, your application can achieve at least 3,500 PUT/COPY/POST/DELETE or 5,500 GET/HEAD requests per second per partitioned prefix.

docs.aws.amazon.com


DELETEの場合は秒間3,500までは耐えられ(パーティションprefixを無視した場合)、今回1並列ごとに1000オブジェクトで投げているため、1000*3並列=3000オブジェクトまでは耐えられる(「4」になるとエラーが出始める)ということでこの値にしました。


503エラー時のリトライ

オブジェクトが何万件もある場合、通常CLISDKで一気に削除しているとまれに S3 api側でSlowDownエラー(503エラー)が起こることがあります。


これが起きた場合cls3では、数秒待って何度か自動リトライする仕組みを入れることで対応しています。


進捗バーによるオブジェクト数や削除時間の把握

デフォルトで進捗バーが出ます。これにより、以下の情報がわかります。

  • 全オブジェクト数
  • 削除済みのオブジェクト数
  • 完了予測時間
❯ cls3 -i
Filter a keyword of bucket names: testgoto

? Select buckets.
 testgoto1
OK? (Y/n)

INF testgoto1 Checking...
INF testgoto1 Clearing...
  52% |██████████████████████████                        | (12000/22882) [4s:4s]

-q | --quietオプションで進捗バーを非表示にできます。


使い方

インストール

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] [-q|--quiet] [-o|--oldVersionsOnly]


オプション

  • -b, --bucketName
    • S3バケット
      • 対話モードでない場合は必須
      • 対話モードでは指定できない
    • 複数バケット名指定ができます
      • cls3 -b test1 -b test2
  • -p, --profile(オプション)
    • AWSプロファイル名
    • (デフォルト: 実行環境のデフォルトのプロファイルが使用されます)
  • -r, --region(オプション)
    • AWS Region
    • (デフォルト: ap-northeast-1)
    • リージョン跨ぎで削除できるので特に気にしなくてOK
  • -f, --force(オプション)
  • -i, --interactive(オプション)
  • -q, --quiet(オプション)
  • -o, --oldVersionsOnly(オプション)
    • 非現行バージョンのみ全て削除する
      • 新しいバージョンのオブジェクトのみをS3バケットに残すことができます
      • バージョニングがオンからオフに変更した状態でも問題なく実行できます
    • -fオプションと一緒には使えません


対話モード

バケット名検索

-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