この記事について

あるS3バケットがありました。このバケット上で、同一ファイル名のオブジェクトの削除/作成/上書きを繰り返しています。
このバケットのバージョニングを有効化にしてしまいました。

バージョニングの有効化に気づくのに遅れて、数日経ってから見てみると、非現行バージョンがとんでもない数になっていました。
一つ一つ削除していたら1日が終わってしまうレベルです。。

マネージメントコンソールからバケットを空にすれば現行バージョンのオブジェクトも削除されてしまいます。そのため一括で非現行バージョンを削除することが難しそうです。
S3のライフサイクル機能を利用して、非現行バージョンのみを一日待てば削除することはできますが、すぐには削除することができません。

そんな時にS3バケット高速削除・空にするツール「cls3」を利用すれば、非現行バージョンを一撃で削除することができます。

この記事にはcls3の紹介および、cls3を利用して非現行バージョンのオブジェクトを削除する方法について記載します。

ある日X(Twitterにて)

困り果てたエンジニアもどきがいました。

そんな時に救世主が

どうやらいい感じのツールがあるらしい!
そしてさらに、ツール作者の方までご降臨される超展開が!

これがあるからX(Twitter)はやめられません。。。
@web_seさん、@365_step_techさん、ありがとうございますm(_ _)m

こんなことになったからには実際に利用するしかないので、早速使ってみます!

S3バケット高速削除・空にするツール「cls3」

オブジェクトの非現行バージョンのみの一括削除は行うことができません。(2024年2月現在)
ライフサイクル機能を利用しても一日待つ必要があり、即座の削除は不可能です。

そんな問題を解決するのがcls3です。
cls3はGo言語で実装されたツールで、バージョンを楽に/高速に削除して、S3バケットを削除できるようにします。

cls3は複数バケットを対象にとることができ、さらにリージョンを跨いだ複数のバケットを対象にすることも可能です。
また実行時にプログレスバーが表示されるため、削除対象が大量にあるケースでも、削除がどのくらいで終わるか把握することが可能です。

実際に使ってみる

まずはインストールします。

> brew install go-to-k/tap/cls3

これだけで使える用意はできました。

今回はテスト用のバケットを用意して、非現行オブジェクトをいくつか作成しました。

test.txtの現行バージョンがあり、非現行バージョンが15個あります。
この非現行バージョンを削除するために、以下のコマンドを実行します。

> cls3 -b test-matsuda-20240216 -o

INF test-matsuda-20240216 Checking...
INF test-matsuda-20240216 Clearing...
 100% |██████████████████████████████████████████████████| (15/15)
INF test-matsuda-20240216 Cleared!!: 15 objects.

これだけです!なんて簡単。。。

確認してみると、見事に非現行バージョンのみ削除されていました。

注意点

oオプションをつけないと、現行バージョン含む全てのバージョンが削除されてしまいます。
そのため、非現行バージョンのみを削除したい場合は、必ずoオプションをつけましょう。

–oldVersionsOnly, -o Delete old version objects only (including all delete-markers) (default: false)

最後に

Xでつぶやいたところ、思わぬ救世主が現れて課題解決に至りました。
同じように大量の非現行バージョンに苦しんでいる方がいれば、ぜひcls3を利用してみてください!

そして利用したらGitHubにスターをつけましょう!

以上です!