はじめに
AWS S3のバケットポリシーを設定する際に誤ったポリシーを適用すると、
意図せずバケットの削除ができなくなることがあります。
本記事では、そうした状況に陥った場合の原因と解決策について解説します。
1. S3バケットを削除するための条件
まず、前提としてS3のバケット削除時には以下の条件を満たしている必要があります。
- バケットが空であること(すべてのオブジェクトが削除済み)
- バケットのバージョニングが有効となっていた場合、すべてのバージョンが削除されていること
- バケットポリシーやアクセス制御リスト(ACL)によって削除がブロックされていないこと
- IAMポリシーによって削除権限が適切に付与されていること
誤ったバケットポリシーを適用すると、バケットを作成したIAMユーザーで適切なIAMポリシーが設定されていても参照、削除ができなくなることがあります。
2. 本記事で想定するケース
本記事ではバケットポリシーの設定不備によりバケットが削除できなくなってしまった場合を想定して説明します。
下記はバケット及び、バケット内のすべてのオブジェクトに対するすべての操作を拒否するバケットポリシーです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Principal": "*",
"Effect": "Deny",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket-test-zombie",
"arn:aws:s3:::bucket-test-zombie/*"
]
}
]
}
仮にこのポリシーをバケットに設定してしまうと、バケットの設定内容やオブジェクトのアップロード、削除などすべての操作ができなくなってしまいます。
今回は「bucket-test-zombie」という上記ポリシーを設定した場合を想定して説明していきます。
試しに上記ポリシーを適用した「bucket-test-zombie」に対して、AWS CloudShell(CLI)からバケット削除のコマンドを実行してみますが、バケット削除ができないことが分かります。
$ aws s3api delete-bucket --bucket bucket-test-zombie An error occurred (AccessDenied) when calling the DeleteBucket operation: User: arn:aws:sts::****:**** is not authorized to perform: s3:DeleteBucket on resource: "arn:aws:s3:::bucket-test-zombie" with an explicit deny in a resource-based policy
同様に、設定したバケットポリシーを削除することもできません。
$ aws s3api delete-bucket-policy --bucket bucket-test-zombie An error occurred (AccessDenied) when calling the DeleteBucketPolicy operation: User: arn:aws:sts::****:**** is not authorized to perform: s3:DeleteBucketPolicy on resource: "arn:aws:s3:::bucket-test-zombie" with an explicit deny in a resource-based policy
3. 解決策
今回のようなケースだとIAMユーザーではバケットを削除することはできなくなってしまいます。
ここでルートユーザーの出番です。
ルートユーザーであれば、仮に設定ミスでアクセス不可になってしまったバケットであってもバケットポリシーの操作が可能です。
ルートユーザーでAWSマネージドコンソールにログインし、下記手順の流れでバケットの削除(必要に応じてポリシーを修正)します。
3.1 バケットポリシーを削除
初めに、バケットを操作可能にするためにバケットポリシーを削除(または必要に応じて編集)します。
「AWSマネージドコンソール→Amazon S3→バケット→アクセス許可→バケットポリシー」からバケットポリシーを削除(編集)します。

3.2 バケットのオブジェクトを削除する
バケットポリシーを削除するとバケット内のオブジェクトの操作が可能になるためオブジェクトをすべて削除します。
「AWSマネージドコンソール→Amazon S3→バケットを選択→空にする」からバケット内のオブジェクトを一括削除します。

※注意
AWS CloudShell(CLI)からでもオブジェクトの削除は可能ですが、バージョニングが有効になっている場合、削除マーカーを含む一括削除が困難なためAWSマネージドコンソールからの削除をおすすめします。
3.3 バケットを削除する
オブジェクトがすべて削除できたら、最後にバケットを削除します。
「AWSマネージドコンソール→Amazon S3→バケットを選択→削除」からバケットを削除します。

以上でバケットの削除が完了です。
4. まとめ
今回はバケットポリシーの設定ミスによりバケットの削除ができなくなってしまったケースについて紹介しました。
S3のバケットポリシーを誤って設定すると、想定外のトラブルが発生することがあります。
バケットポリシーを適用する前に十分にテストし、適切な権限管理を行いましょう。




