CloudFormation で S3 バケット作成後、スタックの削除時に「The bucket you tried to delete is not empty. You must delete all versions in the bucket.」が表示されて DELETE_FAILED になる場合の対処方法

バージョニングが有効化されている S3 バケット内にオブジェクトが一つ以上存在しているために S3 バケットが削除できない状況です。この記事では 4 通りの対応方法を紹介しています。
2022.02.27

困っていた内容

CloudFormation で S3 バケットを作成しました。用事が済んだため対象スタックを削除しようとしたら、The bucket you tried to delete is not empty. You must delete all versions in the bucket. というエラーが発生し、スタックのステータスが DELETE_FAILED となって削除が完了しません。対処方法を教えてください。

CloudFormationのエラー内容

どう対応すればいいの?

バージョニングが有効化されている S3 バケット内にオブジェクトが一つ以上存在していることで S3 バケットが削除できずに当該エラーが発生しています。

対応方法については、下記の 4通りが考えられます。

① Amazon S3 コンソールから削除する
② AWS SDK を使用して削除する
③ ライフサイクルルールを使用して削除する
④ カスタムリソースを使用する

以下にてそれぞれの対応方法について記載いたします。

① Amazon S3 コンソールから削除する

一番簡単に実施できるのがこの手順です。S3 バケット内に少数のオブジェクトが存在している場合にはこちらがお勧めです。

S3 コンソールにアクセス後、対象バケット名の左のチェックボックスを選択した状態で「空にする」をクリックします。 コンソールで空にするを選択

完全に削除 と入力して「空にする」をクリックします。

完全に削除と入力する

バージョニングの表示をオンにしても、オブジェクトが存在しない状態になりました。

オブジェクトの表示

バケットの中身が空になったため、再度スタックの削除を実施してください。

② AWS SDK を使用して削除する

AWS SDK を使用して S3 バケットの中身を空にすることもできます。今回は python を使用して実行します。

参考 URL より以下の python コードを test.py という名前で保存します。

#!/usr/bin/env python

BUCKET = 'your-bucket-here' #バケット名を指定する

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket(BUCKET)
bucket.object_versions.delete()

python3 および pip がインストールされた環境で以下のコマンドを実行して Boto3 をインストールします。

$ pip install boto3

python3 コマンドで test.py ファイルを実行します。

$ python3 test.py

list-object-versions コマンドを実行して何も返却されないことを確認します。

$ aws s3api list-object-versions --bucket your-bucket-here

そして最後にスタックの削除を実施してください。

③ ライフサイクルルールを使用して削除する

S3 バケット内に大量のオブジェクトが存在する場合、日数はかかってしまいますがライフサイクルルールを使用してバケットの中身を空にすることをお勧めします。

S3 コンソールにアクセス後に対象バケットを選択して管理タブを開き、「ライフサイクルルールを作成する」をクリックします。

ライフサイクルルールの作成

ライフサイクルルール名を入力し、「バケット内の全てのオブジェクトに適用」を選択して注意事項にチェックマークを入れます。そして以下の3つのアクションにチェックマークを入れます。

  • オブジェクトの現行バージョンを有効期限切れにする
  • オブジェクトの非現行バージョンを完全に削除
  • 有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除

ライフサイクルルール設定1

上記に選択したアクションに応じた日数の指定が求められますので以下の通り記入した後に「ルールの作成」をクリックします。

  • 「オブジェクト作成後の日数」に 1 を指定
  • 「オブジェクトが現行バージョンでなくなってからの日数」に 1 を指定
  • 「不完全なマルチパートアップロードを削除」を選択して「日数」に 1 を指定

ライフサイクルルール設定2

次に 2つ目のライフサイクルルールを作成します。
先ほどと同様にライフサイクルルール名を入力し、「バケット内の全てのオブジェクトに適用」を選択して注意事項にチェックマークを入れます。
次に「有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除」にチェックマークを入れます。

2つ目のライフサイクルルールの作成

「期限切れのオブジェクト削除マーカーを削除する」を選択して「ルールの作成」をクリックします。

2つ目のライフサイクルルールの設定

オブジェクトが全て削除されたことが確認できたら、スタックの削除を実施してください。

④ カスタムリソースを使用する

Lambda を使用したカスタムリソースを CloudFormation で定義することで、スタックを削除する際に S3 バケットと一緒にオブジェクトも削除するように設定することができます。

以下の記事にて設定方法をご案内しておりますのでご参照ください。

参照