今回はAWSのElastic Beanstalkで作成したS3バケットの削除時にアクセス拒否されてバケットが削除できない場合の対処法について説明します。
発生した事象
AWSのElastic Beanstalkで作成したアプリケーションを削除後、Elastic Beanstalk作成の際にできたバケットの中身を空にして削除しようとしたところ、アクセス拒否されて削除できないという事象が発生しました。


原因
Elastic Beanstalkで作成されたS3のバケットポリシーでバケットを削除するs3:DeleteBucketのActionがDenyとなっていることが原因とのことです。バケットポリシーを確認したところ、確かにs3:DeleteBucketのEffectがDenyとなっていました。
また、バケットポリシーの優先順位を調べてみると「明示的な拒否 > 明示的な許可 > デフォルトの拒否」となっていました。そのため、IAMユーザー等でs3:DeleteBucketを許可する権限を付与しても、バケットポリシーの明示的な拒否が先に働きアクセス拒否となってしまいます。
試してみたこと
バケットポリシーのEffectがDenyとなっているのであれば編集ですぐ解決するだろうと思い、Denyの部分をAllowに変え保存しようとしたところアクセス拒否で保存ができないことを確認しました。

バケットポリシーの編集でアクセス拒否が表示されるということで、念のためIAMユーザーのS3に関するアクセス権限を確認しましたが、作業で使用しているユーザーはS3に対して全てのアクセス権限を持っているため関係がないと判断しました。また、rootユーザーで同様にバケットポリシーの編集を試みてもアクセス拒否が表示され編集できませんでした。
解決した方法
バケットポリシーを削除してからバケットを削除することで、Elastic Beanstalkで作成されたバケットを削除できました。バケットポリシーの削除については、右側にある「削除」から削除できます。


まとめ
- S3のバケットが削除できない時はバケットポリシーに明示的な拒否が無いか確認する
- バケットポリシーの優先順位は「明示的な拒否 > 明示的な許可 > デフォルトの拒否」
- バケットポリシーの編集ができない場合は、一度バケットポリシーを削除してからバケットを削除する
※2020/7/6追記
バケットポリシーが編集できない件は、バケットの「パブリックアクセスをすべてブロック」がオフになっていても、S3コンソールの左側にあるブロックパブリックアクセス(アカウント設定)の「パブリックアクセスをすべてブロック」がオンになっているとアクセスが拒否されます。
編集のために一時的に設定を変更できるようであれば、ブロックパブリックアクセス(アカウントの設定)からオフにしてバケットポリシーの編集を行ってみてください。