Amazon S3 バケットが削除できない 5 つの原因と対処法

  • URLをコピーしました!
目次

はじめに

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://バケット名 --force

aws 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-versionsdelete-object(versionId 指定)
オブジェクト数が膨大ライフサイクルルールで失効させてから削除
ポリシー Deny で拒否拒否ステートメントの削除(または aws s3api delete-bucket-policy

まとめ

本記事では、Amazon S3 のバケットが削除できない主な原因と対処法を、GUI と CLI の両面から解説しました。削除の前提は「完全に空」にすることで、空とはオブジェクト・バージョン・削除マーカー・未完了マルチパートがすべてない状態です。要点を以下に整理します。

  • 削除の前提はオブジェクト・バージョン・削除マーカー・未完了マルチパートの完全削除
  • バージョニング有効時はバージョンを指定して完全削除
  • 大量オブジェクトはライフサイクルで失効させてから削除
  • バケットポリシーの Deny は拒否ステートメントの削除で解除
  • 削除には s3:DeleteBucket と s3:DeleteObject・s3:DeleteObjectVersion が必要
  • Object Lock のコンプライアンスモードは保持期間満了まで削除不可
  • アクセスポイントやレプリケーション設定の残存も確認

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

関西を拠点に活動する、現役インフラエンジニア。経験20年超。

大手通信キャリアにて、中〜大規模インフラ(ネットワーク・サーバ・クラウド・セキュリティ)の設計・構築およびプロジェクトマネジメントに従事。現場で直面した技術課題への対処や、最新の脆弱性情報への実務対応を、一次情報として発信しています。

保有資格
CCIE Lifetime Emeritus(取得から20年以上)/ VCAP-DCA / Azure Solutions Architect Expert

▶ 運営者プロフィール(詳細)

目次