以下の内容はhttps://go-to-k.hatenablog.com/entry/cls3より取得しました。


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

概要

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


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

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

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

https://github.com/user-attachments/assets/b8c17ce6-527b-4056-a2f5-635a2c16d967


目次

目次


ツール名

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

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


ソースコード

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

スターなど頂けると泣いて喜びます(本当モチベーションが上がるのです…!)

github.com


特徴

「空にする」も「バケットごと削除」も

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


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

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


リージョン跨ぎ

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

※S3 Express One Zoneのための ディレクトバケット モード (-d オプション)、S3 Tablesのための テーブルバケット モード (-t オプション)、S3 Vectorsのための ベクトルバケット モード (-V オプション)ではリージョンをまたいだ操作はできず、1つのリージョン でのみの操作になります。リージョンは -r オプションで指定できます。


バージョニングが有効なバケット削除

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


非現行バージョンのオブジェクトのみ削除

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

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

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


S3 Express One Zoneのディレクトバケット削除

-d | --directoryBucketsMode オプションを使用すると、S3 Express One Zone用のディレクトバケットを削除できます。

このモードでは、S3 Express One Zoneのディレクトバケットの仕様上リージョンをまたいだ操作はできず、1つのリージョン内でのみの操作になります。そのため、リージョンを -r オプションで指定してください。


S3 Tablesのテーブルバケット削除

-t|--tableBucketsMode オプションを使用すると、S3 Tables用のテーブルバケットを削除できます。

このモードでは、S3 Tablesのテーブルバケットの仕様上リージョンをまたいだ操作はできず、1つのリージョン内でのみの操作になります。そのため、リージョンを -r オプションで指定してください。


S3 Vectorsのベクトルバケット削除

-v|--vectorBucketsMode オプションを使用すると、S3 Vectors用のベクトルバケットを削除できます。

このモードでは、S3 Vectorsのベクトルバケットの仕様上リージョンをまたいだ操作はできず、1つのリージョン内でのみの操作になります。そのため、リージョンを -r オプションで指定してください。


カスタムエンドポイントURL

-e | --endpointUrlオプションを使用すると、S3互換のオブジェクトストレージサービスや、特定のS3のエンドポイントにアクセスできます。

つまり、MinIO や Cloudflare の R2 などのオブジェクトストレージを、cls3で削除することができます。

Google Cloud StorageはS3と完全な互換性があるわけではなくさまざまな制限があるため、現状サポートしていません。

CLS3_ENDPOINT_URL 環境変数でも使用可能です。

export CLS3_ENDPOINT_URL=https://your-account.r2.cloudflarestorage.com

AWS CLI / AWS SDK で指定できる AWS_ENDPOINT_URLAWS_ENDPOINT_URL_S3 でも指定可能ですが、他のAWSツールに影響が出てしまうため、CLS3_ENDPOINT_URLを推奨します。


パス形式のURL

-P | --pathStyle オプションを使用すると、仮想ホスト(virtual-hosted-style)形式のURL(例: https://bucket.endpoint.com)の代わりに、パス形式のURL(例: https://endpoint.com/bucket)を使用できます。

このオプションは、CephMinIO のようなS3互換のストレージシステムで、基本的には-e | --endpointUrl オプションと組み合わせて使用します。

※このオプションは、ディレクトバケットモード (-d)、テーブルバケットモード (-t)、またはベクトルバケットモード (-V) では使用できません。


複数バケットの同時(並列)削除

-c | --concurrentMode オプションを使用すると、複数のバケットを並列で削除 できます。このオプションが指定されていると、デフォルトですべてのバケットが並列で削除されます。

並列数を制限したい場合は、-n | --concurrencyNumber オプションを指定できます。たとえば、-c -n 5 とすると、最大5並列でバケットを削除します。

並列数が多すぎるとS3 APIエラーが起こる可能性があります。 失敗した場合は、もう一度実行するか、-nを指定して実行してください。


このオプションはテーブルバケットモード (-t) では使用できません(S3テーブルはスロットリング閾値が非常に低いため)。


削除できるオブジェクト数の制限無し

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

大量のオブジェクト削除にも是非。


503エラー時のリトライ

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

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


特定のキープレフィックスのオブジェクトのみ削除

特定のキープレフィックスのオブジェクトのみを-k | --keyPrefixオプションで削除できます。

Express One Zone用のディレクトバケットでは、/で終わるプレフィックスのみをサポートしているので、指定したプレフィックス/が付いていない場合は自動で付きます。

S3 Tables用のテーブルバケットでは、このオプションはサポートしていません。

S3 Vectors用のベクトルバケットでは、特定のプレフィックスのみのインデックスを削除できます。


使い方

インストール

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>] [-e|--endpointUrl <endpointUrl>] [-P|--pathStyle] [-f|--force] [-i|--interactive] [-o|--oldVersionsOnly] [-q|--quietMode] [-d|--directoryBucketsMode] [-t|--tableBucketsMode] [-V|--vectorBucketsMode] [-c|--concurrentMode] [-n|--concurrencyNumber <number>] [-k|--keyPrefix <keyPrefix>]


オプション

  • -b, --bucketName
    • S3バケット
      • 対話モードでない場合は必須
      • 対話モードでは指定できない
    • 複数バケット名指定ができます
      • cls3 -b test1 -b test2
  • -p, --profile(オプション)
    • AWSプロファイル名
    • (デフォルト: 実行環境のデフォルトのプロファイルが使用されます)
  • -r, --region(オプション)
    • AWS Region
    • (デフォルト: us-east-1)
      • このオプションが指定されず、AWSプロファイルがリージョンに紐付けられている場合、デフォルトのリージョンの代わりにそのリージョンが使用されます。
    • リージョン跨ぎで削除できるので、基本的には気にしなくても良いです
      • しかし、S3 Express One Zoneのディレクトバケットモード (-d オプション)、S3 Tablesのための テーブルバケット モード (-t オプション)、S3 Vectorsのための ベクトルバケット モード (-V オプション) では、S3の仕様上リージョンをまたいだ操作ができないため、リージョンを指定する必要があります
  • -e, --endpointUrl(オプション)
    • -e | --endpointUrlオプションを使用すると、S3互換のオブジェクトストレージサービスや、特定のS3のエンドポイントにアクセスできます。
    • つまり、MinIO や Cloudflare の R2 などのオブジェクトストレージを、cls3で削除することができます。
      • Google Cloud StorageはS3と完全な互換性があるわけではなくさまざまな制限があるため、現状サポートしていません。
    • CLS3_ENDPOINT_URL 環境変数でも使用可能です。
      • export CLS3_ENDPOINT_URL=https://your-account.r2.cloudflarestorage.com
      • AWS CLI / AWS SDK で指定できる AWS_ENDPOINT_URLAWS_ENDPOINT_URL_S3 でも指定可能ですが、他のAWSツールに影響が出てしまうため、CLS3_ENDPOINT_URLを推奨します。
  • -P, --pathStyle(オプション)
    • 仮想ホスト形式(例: https://bucket.endpoint.com)の代わりに、パス形式のURL(例: https://endpoint.com/bucket)を使用します。
    • CephやMinIOのような、パス形式のURLを必要とするS3互換のストレージシステムで作業する際に、基本的には-e | --endpointUrlと合わせて使用します。
    • ディレクトバケットモード(-d)、テーブルバケットモード(-t)、またはベクターバケットモード(-V)とは併用できません。
  • -f, --force(オプション)
    • S3バケットごと削除する
      • -t (--tableBucketsMode)オプションと使う場合、ネームスペースとテーブルだけでなくテーブルバケット自身も削除されます。
      • -V (--vectorBucketsMode)オプションと使う場合、インデックスだけでなくベクトルバケット自身も削除されます。
  • -i, --interactive(オプション)
  • -o, --oldVersionsOnly(オプション)
    • 非現行バージョンのオブジェクトと削除マーカーのみを全て削除する
      • 新しいバージョンのオブジェクトのみをS3バケットに残すことができます
      • バージョニングがオンからオフに変更した状態でも問題なく実行できます
    • -fオプションと一緒には使えません
  • -q, --quietMode(オプション)
    • 削除数のリアルタイム表示をしません
    • CI環境などでリアルタイム削除数の表示は不要な場合におすすめです
  • -d, --directoryBucketsMode(オプション)
    • ディレクトバケット モード(S3 Express One Zone用)
    • S3の仕様上リージョンをまたいだディレクトバケットの操作ができないので、1つのリージョンのみでの操作(一覧表示・削除)になります
      • -rオプションでリージョンを指定してください
  • -t, --tableBucketsMode(オプション)
    • テーブルバケットモード(S3 Tables用)
    • S3の仕様上リージョンをまたいだテーブルバケットの操作ができないので、1つのリージョンのみでの操作(一覧表示・削除)になります
      • -rオプションでリージョンを指定してください
    • -fオプションをつけない場合、ネームスペースとテーブルだけが削除され、テーブルバケット自身は残ります
  • -v, --vectorBucketsMode(オプション)
    • ベクトルバケットモード(S3 Vectors用)
    • S3の仕様上リージョンをまたいだベクトルバケットの操作ができないので、1つのリージョンのみでの操作(一覧表示・削除)になります
      • -rオプションでリージョンを指定してください
    • -fオプションをつけない場合、ネームスペースとテーブルだけが削除され、テーブルバケット自身は残ります
  • -c, --concurrentMode(オプション)
    • 並列で複数のバケットを削除します
    • 並列数を制限したい場合は、-nオプションを指定してください
    • 並列数が多すぎるとS3 APIエラーが発生する可能性があります。 失敗した場合は、もう一度実行するか、-nを指定して実行してください
    • このオプションはテーブルバケットモード (-t) では使用できません
  • -n, --concurrencyNumber(オプション)
    • 並列数を指定します
    • このオプションを指定するには、-cオプションが指定されている必要があります
    • -cオプション(だけ)を指定した場合は、デフォルトではすべてのバケットを並列で削除します
  • -k, --keyPrefix(オプション)


対話モード

バケット名検索

-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)、S3 Tablesのテーブルバケットモード(table-buckets-mode)、S3 Vectorsのベクトルバケットモード (vector-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)
          table-buckets-mode: false # Table Buckets Mode for S3 Tables (default: false)
          vector-buckets-mode: false # Vector Buckets Mode for S3 Vectors (default: false)
          region: us-east-1 # Specify the region in the Directory Buckets Mode for S3 Express One Zone, Table Buckets Mode for S3 Tables, and Vector Buckets Mode for S3 Vectors.
          endpoint-url: https://s3.custom.endpoint.com # Custom endpoint URL (default: "")
          path-style: false # Use path-style URL addressing (default: false)
          concurrent-mode: true # Delete multiple buckets in parallel (default: false)
          concurrency-number: 8 # Specify the number of parallel deletions (requires concurrent-mode to be true)
          key-prefix: test-prefix # Key prefix of the objects to be deleted.

また、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





以上の内容はhttps://go-to-k.hatenablog.com/entry/cls3より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14