S3 Tables の Table Bucket を簡単に削除できる機能を、S3削除ツール『cls3』に追加しました。
目次
Amazon S3 Tables
S3 Tables の発表
AWS re:Invent 2024 のキーノートにてAmazon S3 Tablesという新サービスの発表がありました。
Amazon S3 Tables は、Apache Iceberg サポートが組み込まれた初めてのクラウドオブジェクトストアであり、表形式のデータを大規模に保存する最も簡単な方法でもあります。S3 テーブルは分析ワークロード専用に最適化されているため、セルフマネージドテーブルと比較して、クエリのスループットが最大 3 倍速く、1 秒あたりのトランザクション数が最大 10 倍多くなります。
詳細は以下のリファレンスをご覧ください。
S3 バケットの種類
S3 Tables を通して、テーブルバケット(Table Buckets)というバケットが新たに S3 に追加されました。
これにより、現在 S3 には以下の種類のバケットがあります。
S3 Tables の構成要素
S3 Tables における Tables Buckets(テーブルバケット)の構成要素は以下になります。
- テーブルバケット
- ネームスペース
- テーブル
「テーブルバケット / ネームスペース / テーブル」という階層構成となります。
また2025 年 1 月 30 日現在、デフォルトで AWS アカウントごとに上限の個数制限(Service Quotas)があります。
※ S3 Express One Zone で使用される Directory Buckets も、発表当初は 1 アカウント(リージョン単位)に 10 個までだったのがいつの間にか 100 個になっていたので、しれっと増えることもあるかもしれません。
※詳細は以下をご覧ください。
S3 Tables(テーブルバケット)の削除ルール
さて、本記事は「S3 Tables の Table Bucket を簡単に削除しよう!」ということですが、S3 Tables の Table Bucket を削除するためには以下のルールがあります。
- 該当テーブルバケットの全ネームスペースを先に削除する必要がある
- ネームスペースを削除するには、該当ネームスペースの全テーブルを先に削除する必要がある。
つまり、テーブルバケットを削除するには、以下の一連の流れが必要です。
- 該当テーブルバケットの全ネームスペースを取得する
- それぞれのネームスペースに所属する全テーブルを取得する
- それぞれのネームスペースごとの全テーブルを削除する
- 該当テーブルバケットの全てのネームスペースを削除する
- 該当テーブルバケットを削除する
ちょっとめんどくさいですよね。
実際に困っている人もいました。
なので、これを簡単に、1 コマンドでできるようにしました。
cls3
cls3 とは?
私が OSS として開発している、S3 削除のための便利な CLI ツールになります。
GitHub は以下になります。(スターいただけたら嬉しいです!)
今までの機能
詳細は先ほど載せたブログや GitHub を参照してください。
具体的には以下のことができます。
- バケットを削除することも、空にすることもできる
- オブジェクトの並行削除によって高速なバケット削除ができる
- 大量削除などの際のスロットリングエラー時には内部で自動的にリトライをしてくれる
- 対話モードで複数のバケットを検索でき、指定できる
- リージョン横断で、複数バケットを一括で削除できる
- バージョニングがオンのバケットも削除できる
- 古いバージョンのオブジェクトだけを削除できる
- S3 Express One Zone のための Directory Buckets の削除もできる
- GitHub Actions 用の機能も提供している
インストール
様々なインストール方法を提供しています。
※インストール方法の詳細は以下のリンクから
S3 Tables の Table Bucket 削除機能
Table Buckets Mode
S3 Tables の Table Bucket を削除する機能を、cls の v0.23.0 に取り入れました。
cls3 では、CLI のオプション(-b)でバケット名を直接指定することも、対話モード(-i)により対話で検索しながらバケットを指定することもできます。
今回のリリースでは Table Buckets Mode というモード(オプション)を導入し、以下の様に簡単に S3 Tables の Table Bucket を削除することができるようになりました。(対話モードを例に)
「-t | --tableBucketsMode」オプションを指定して Table Bucket の「中身」を削除、つまり該当 Table Bucket の全ネームスペースと全テーブルを削除します。
「-f | --forceMode」を合わせて指定すると、全ネームスペースと全テーブルに加えてTable Bucket ごと削除することができます。
改善リリース
実はこの後すでにいくつかのバージョンをリリースしています。
Table Bucket 削除の並列数を少し下げたり、より細かいリアルタイム削除数を表示したりできるようになりました。他には主にリファクタリングや細かいエラーハンドリングなどです。
そのため、その時点での最新のバージョンを使用していただくのが良いです。
注意点
S3 Tables の API は、既存の S3 と API エンドポイントが異なります。
S3 Tables の API が新しい API だからなのか、そういう仕様なのかわかりませんが、ある程度の並列で削除処理を行うと TooManyRequest エラーや Internal Error が発生し、リトライを促されることがあります。
そのため cls3 では、並列数をギリギリまで下げ、それらのエラーが起きた時には自動でリトライする仕組みを入れてカバーしています。
※もしまだエラーが出るようであれば、今後のリリースでより並列数を下げるつもりです。
おまけ
今開発中の機能: 複数バケットの並列削除機能
複数バケットの並列削除機能(-c: concurrent モード)の実装をしています。
-n で並列数も指定可能。また、リアルタイム削除数出力(削除オブジェクト数カウンター)で、完了したバケットから順次緑色に変えるようにもしています。
ただ、あまりに並列数が多すぎると S3 API で謎エラーが出ており、この調査中のためリリースはもう少しかかりそうです。
※今はバケットのオブジェクトは並列で削除していますが、複数バケットを指定した際の各バケットの削除は直列になっています。
まとめ
S3 Tables の Table Bucket を簡単に削除する機能を cls3 に導入しました。
これを機に、ぜひ S3 Tables だけでなく、通常の S3 バケットの削除にもこのツールを使用してもらえると嬉しいです。きっと役に立つと思います。