はじめに
Amazon S3 を使ったシステムの運用や環境整理で、不要になったバケットを削除しようとしてエラーになり、処理が進まないことは珍しくありません。S3 は誤削除によるデータ消失を防ぐため、削除に厳密な条件を設けています。管理者権限があっても、これらの条件を満たさない限りバケットは削除できません。
- S3 バケットが削除できない主な 5 つの原因
- オブジェクト・バージョン・削除マーカー・未完了マルチパートの完全削除手順
- バケットポリシーによる削除拒否(Deny)の解除方法
- IAM に必要な削除権限(
s3:DeleteBucketなど)の確認ポイント - Object Lock による保護で削除できない場合の考え方
結論として、バケット削除の前提は「完全に空」にすることで、空とはオブジェクト・全バージョン・削除マーカー・未完了のマルチパートアップロードがすべてない状態を指します。空にしても削除できない場合は、バケットポリシーの Deny、IAM 権限の不足、Object Lock の保持期間が原因として考えられます。本記事では、5 つの原因と GUI・CLI 両面の対処法を整理します。
原因 1: バケット内にオブジェクトが残っている
S3 の基本仕様として、オブジェクトが 1 つでも残っているバケットは削除できません。誤操作による重要データの消失を防ぐためのフェイルセーフです。マネジメントコンソールで削除に失敗した場合は、まず対象バケットが完全に空かを確認します。なお「空」には、表示されているオブジェクトだけでなく、過去のバージョン・削除マーカー・未完了のマルチパートアップロードも含まれます(バージョンと削除マーカーは原因 2 で扱います)
- GUI で空にする手順
-
対象バケットを選択し「空にする(Empty)」をクリックします。確認画面で指定のテキスト(
permanently deleteなど)を入力して実行すると、現在表示中のオブジェクトが一括削除されます。 - CLI で空にする手順(バージョニング無効のバケット)
-
# バケット内のオブジェクトを再帰的に削除 aws s3 rm s3://バケット名 --recursive # 空にしてからバケットを削除(オブジェクト削除+バケット削除を一括) aws s3 rb s3://バケット名 --forceaws s3 rb --forceはオブジェクトを削除してからバケットを削除しますが、バージョニングが有効なバケットではバージョン付きオブジェクトが削除されず、バケットが空にならないため失敗します。 バージョニング有効時の手順は原因 2 で扱います。未完了のマルチパートアップロードが残っていると、見た目は空でも削除できないことがあります。
aws s3api list-multipart-uploads --bucket バケット名で確認し、残っていればライフサイクルルールやaws s3api abort-multipart-uploadで整理します。参考: Emptying a general purpose bucket(AWS 公式ドキュメント)
“All objects, including all object versions and delete markers, must be deleted”
(すべてのオブジェクトを、全バージョンと削除マーカーも含めて削除する必要がある)
https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html
原因 2: バージョニングの過去バージョン・削除マーカーが残っている
「空にする」操作をしても削除できない場合、最も多いのがバージョニングによる過去データの残存です。バージョニングが有効なバケットでは、オブジェクトを削除しても画面上の通常表示から消えるだけで、内部的には削除マーカーや過去バージョンが非表示で保持されます。これらをすべて消さないと、バケットは削除できません。
- GUI での完全削除手順
-
- バケットの「オブジェクト」タブで「バージョンを表示」をオンにします。
- 過去のバージョンや削除マーカー(Delete marker)が一覧に表示されます。
- 履歴を含むすべてのオブジェクトを選択して削除します。
- CLI での完全削除手順(バージョニング有効)
-
バージョン ID を指定して削除します。
aws s3api list-object-versionsでバージョンと削除マーカーを列挙し、aws s3api delete-objectで版を指定して削除します。# バージョンと削除マーカーの一覧を確認 aws s3api list-object-versions --bucket バケット名 # 版を指定してオブジェクトを完全削除(versionId を指定) aws s3api delete-object --bucket バケット名 --key オブジェクトキー --version-id バージョンIDオブジェクト数が多い場合、手動削除は現実的ではありません。ライフサイクルルールで、非現行バージョン・期限切れの削除マーカー・未完了マルチパートを失効させてから、空になったバケットを削除する方法が実用的です。
原因 3: バケットポリシーで削除が拒否(Deny)されている
中身を空にしても「アクセス権限がありません」というエラーで削除できない場合、バケットポリシーで削除アクション(s3:DeleteBucket)が明示的に拒否(Deny)されている可能性があります。これは Elastic Beanstalk など、AWS の別サービスが自動生成したバケットでよく見られます。

- 修正手順
-
- S3 コンソールで対象バケットを選び「アクセス許可」タブを開きます。

- 「バケットポリシー」の「編集」を開きます。
"Action": "s3:DeleteBucket"を含む拒否ステートメントを確認し、該当ブロックを削除します。
- 保存後、再度バケットの削除を実行します。

明示的な Deny は明示的な Allow に優先するため、Deny を Allow に書き換えるより、拒否ステートメント自体を削除するほうが安全です。 CLI では、バケットポリシーごと削除する aws s3api delete-bucket-policy --bucket バケット名 も使えます。
原因 4: IAM ユーザーに削除権限がない
バケットが空で、ポリシーによる拒否もないのに削除に失敗する場合、操作している IAM ユーザーやロールに削除権限がない可能性があります。IAM コンソールで、対象にアタッチされているポリシーを確認します。バケットの削除には s3:DeleteBucket が必要で、空にする過程ではオブジェクト削除の s3:DeleteObject、バージョン削除の s3:DeleteObjectVersion も必要になります。
権限が不足している場合は、AWS 管理者に追加を依頼するか、適切な権限を持つアカウントで作業します。
原因 5: Object Lock の保持期間中で削除できない
バケットで Object Lock(WORM)が有効な場合、保持期間中のオブジェクトバージョンは削除できず、結果としてバケットも削除できません。Object Lock は誤削除やランサムウェアからデータを守るための保護で、削除できないのは設計どおりの動作です。モードによって対処が変わります。
- ガバナンスモード
-
s3:BypassGovernanceRetention権限を持つユーザーが、リクエストにx-amz-bypass-governance-retention:trueヘッダーを付けることで、保護を上書きして削除できます(S3 コンソールは既定でこのヘッダーを付与します) - コンプライアンスモード
-
保持期間中は、ルートユーザーを含め誰も削除・上書きできません。保持期間の満了を待つ必要があります。
- リーガルホールド
-
期限のない保護のため、解除しない限り削除できません。
参考: Locking objects with Object Lock(AWS 公式ドキュメント)
“a protected object version can’t be overwritten or deleted by any user”
(保護されたオブジェクトバージョンは、いかなるユーザーも上書き・削除できない)
https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html
保持期間やリーガルホールドを解除・満了させ、対象バージョンを削除してバケットを空にすれば、削除できるようになります。Object Lock の設定や運用は、関連記事『AWS S3 Object Lock でランサムウェア対策|設定手順と注意点』で扱っています。
その他に確認するポイント
上記 5 原因以外に、次の構成でも削除がブロックされることがあります。
- アクセスポイントや Multi-Region Access Point がアタッチされているバケットは削除できません。先にアクセスポイントを削除します。
- バケットがクロスリージョンレプリケーションのソースになっている場合、先にレプリケーション設定の解除(
aws s3api delete-bucket-replication)が必要になることがあります。
GUI と CLI の使い分け
削除作業は、オブジェクト数やバージョニングの有無で適した手段が変わります。S3 運用全体の要点は、関連記事「Amazon S3 運用の要点|ストレージクラスとセキュリティの勘所」も参考になります。
| 状況 | 適した手段 |
|---|---|
| 少数オブジェクト・バージョニング無効 | GUI の「空にする」、または aws s3 rb --force |
| バージョニング有効 | aws s3api list-object-versions と delete-object(versionId 指定) |
| オブジェクト数が膨大 | ライフサイクルルールで失効させてから削除 |
| ポリシー Deny で拒否 | 拒否ステートメントの削除(または aws s3api delete-bucket-policy) |
まとめ
本記事では、Amazon S3 のバケットが削除できない主な原因と対処法を、GUI と CLI の両面から解説しました。削除の前提は「完全に空」にすることで、空とはオブジェクト・バージョン・削除マーカー・未完了マルチパートがすべてない状態です。要点を以下に整理します。
- 削除の前提はオブジェクト・バージョン・削除マーカー・未完了マルチパートの完全削除
- バージョニング有効時はバージョンを指定して完全削除
- 大量オブジェクトはライフサイクルで失効させてから削除
- バケットポリシーの Deny は拒否ステートメントの削除で解除
- 削除には s3:DeleteBucket と s3:DeleteObject・s3:DeleteObjectVersion が必要
- Object Lock のコンプライアンスモードは保持期間満了まで削除不可
- アクセスポイントやレプリケーション設定の残存も確認
以上、最後までお読みいただきありがとうございました。




