エムオーテックス株式会社が運営するテックブログです。

大量オブジェクトが存在するS3バケットの削除方法

f:id:yusuke_uematsu:20211129183537j:plain

こんにちは。インフラチームの倉橋です。

大量オブジェクトを保有しているS3バケットを削除する機会がありましたので、作業した内容をブログにして残しておこうと思います。

削除対象バケット

今回削除するバケットのオブジェクト数は「833,185」オブジェクトあり、バケットサイズは「447GB」ありました。

削除方法

S3バケットの削除方法は主に以下があります。

  • AWSコンソールから
  • AWS CLIから
  • AWS SDK (boto3など)から

いつもは「AWSコンソール」から削除しているのですが、今後複数バケットを同時削除することもあろうかと思い「AWS CLI」での削除を試しました。

AWS CLIで削除

作成したCLIは以下

aws s3 rb --force s3://[bucket_name]

rb は「オブジェクト削除」の処理となり、
オプションで --force を加えることで「オブジェクト削除」も同時に行ってくれます。
ただし、「バージョニングオブジェクト」は削除対象外で存在している場合バケット削除に失敗します。
「BucketNotEmpty」のエラーメッセージが出ます。
さて、では実行してみよう、ということで実行。
実行は「踏み台サーバー(EC2)」から行います。

$ aws s3 rb --force s3://[bucket_name]
# 以下コマンド出力結果
delete: s3://[bucket_name]/[object_name]
delete: s3://[bucket_name]/[object_name]
delete: s3://[bucket_name]/[object_name]
delete: s3://[bucket_name]/[object_name]
delete: s3://[bucket_name]/[object_name]
...

ずらーっと削除された出力が続きます。で、少し待ちます。

すると、、、

SessionId: xxxxxxx : Your session timed out due to inactivity and has been terminated.

はい、セッション切れましたね。
そうなんです、今回削除バケットには「約83万」オブジェクトあり、CLIでは中々終わらないのです。
先にセッションが切れてしまい、困ったぞとなりました。
そこで次の手です。

AWSコンソールから削除

CLIが駄目ならコンソールで、ということでAWSコンソール上から削除を行います。
まずはオブジェクトの削除から行います。
AWSコンソールのS3を開き対象のバケットを選択してから「空にする」を押下します。

f:id:mo-kurahashi:20211116135615p:plain
空にする

専用画面に遷移するので「完全に削除」を入力し削除を開始します。

f:id:mo-kurahashi:20211116135721p:plain
完全に削除

そうすると削除が開始されます。

f:id:mo-kurahashi:20211116135827p:plain
削除中

グルグルしております。
結果として「約83万」オブジェクトは削除できました。

f:id:mo-kurahashi:20211116140158p:plain
削除完了

処理時間は1時間30分ほどだったと思います。
オブジェクトが削除できましたのでバケット削除を行える状態になりました。

大量オブジェクト削除の効率的な方法

今回はAWSコンソールから削除しましたが、今後複数バケットを対応しないと行けない場合に上記方法は効率的ではないですよね。
ではどうするか?なのですが、「ライフサイクル」を使うべきです。
AWSからもアナウンスされてますね。

f:id:mo-kurahashi:20211116140736p:plain
ライフサイクル案内

「ライフサイクル」を使用すると非同期にて「ルール」に一致するオブジェクトの削除を実施することができます。
「ライフサイクル設定」=>「オブジェクト削除」=>「バケット削除」の流れ。

S3ライフサイクル

では早速ライフサイクルを設定していきましょう。
今回設定したいのは以下。

スコープ アクション 日数
全て オブジェクトの現行バージョンを有効期限切れにする 1
全て オブジェクトの非現行バージョンを完全に削除 1

上記設定により「作成後1日」経過した「現行バージョン」および「以前のバージョン」全てのオブジェクトを削除する事ができます。
該当バケットに新規オブジェクトが作成されない状況であれば「空」にすることができます。
ただし、削除されるタイミングは完全にAWS側の都合になる点注意が必要です。

おわりに

いかがでしたでしょうか?
大量オブジェクト削除の方法について参考になれば幸いです。