BioErrorLog Tech Blog

試行錯誤の記録

Elastic BeanstalkのS3バケットを削除する

Elastic Beanstalk用に作成されていたS3バケットを削除するのに少し手間取ったので、備忘録を残します。

はじめに

おはよう。@bioerrorlogです。

先日、Elastic BeanstalkのS3バケットが削除できないという状況に遭遇しました。 AdministratorAccess権限を持ったIAMユーザーでログインしているのに、"Access Denied"でS3バケットが削除できなかったのです(Fig. 1)。

f:id:BioErrorLog:20200307142442p:plain
Fig. 1 S3バケットを削除しようとするとAccess Deniedとなる

この状況に対する解決策を書きます。


Elastic BeanstalkのS3バケットを削除する

原因: バケットポリシーで削除が拒否されている

バケットポリシーを確認すると、Delete操作が拒否されていました。

バケットポリシーは、S3バケットのコンソールから アクセス権限 > バケットポリシー で確認することができます(Fig. 2)。

f:id:BioErrorLog:20200307144855p:plain
Fig. 2 バケットポリシーの確認

以下、バケットポリシーの全文です。
("XXX" はアカウントidなどのマスクです)

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "eb-XXX",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::XXX:role/aws-elasticbeanstalk-ec2-role"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::elasticbeanstalk-us-east-2-XXX/resources/environments/logs/*"
        },
        {
            "Sid": "eb-XXX",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::XXX:role/aws-elasticbeanstalk-ec2-role"
            },
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketVersions",
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::elasticbeanstalk-us-east-2-XXX",
                "arn:aws:s3:::elasticbeanstalk-us-east-2-XXX/resources/environments/*"
            ]
        },
        {
            "Sid": "eb-XXX",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:DeleteBucket",
            "Resource": "arn:aws:s3:::elasticbeanstalk-us-east-2-XXX"
        }
    ]
}


今回の件で重要なのは次の部分です。

{
    "Sid": "eb-XXX",
    "Effect": "Deny",
    "Principal": {
        "AWS": "*"
    },
    "Action": "s3:DeleteBucket",
    "Resource": "arn:aws:s3:::elasticbeanstalk-us-east-2-XXX"
}

いかなる者であっても:"Principal": "AWS": "*"
Elastic BeanstalkのS3バケットを:"Resource": "arn:aws:s3:::elasticbeanstalk-us-east-2-XXX"
削除することは:"Action": "s3:DeleteBucket"
許されない:"Effect": "Deny"
ということです。

このポリシーこそ、バケットの削除を拒んでいた原因です。


解決策: バケットポリシーを削除する

バケットポリシーが原因であることが分かったので、バケットポリシー自体を削除してしまえば解決します。

バケットポリシーを表示しているコンソール画面から"削除"を押し、バケットポリシーを削除します(Fig. 3)。

f:id:BioErrorLog:20200307150728p:plain
Fig. 3 バケットポリシーを削除する


バケットポリシーを削除したのちにS3バケットを削除すると、エラーなくバケットを削除することができました(Fig. 4)。

f:id:BioErrorLog:20200307151911p:plain
Fig. 4 S3バケットの削除に成功


おわりに

気づいてしまえば至極当然な原因でしたが、最初はAdmin権限をもってして何故削除できない... と少し驚きました。

次に同じ現象に遭遇したときは、焦らずに対処したいものです。


関連記事

AWS CLIのs3 cpとs3 syncの違いをまとめました。 www.bioerrorlog.work


S3バケットポリシーとIAMポリシーの関係を、同一アカウント・クロスアカウントそれぞれにおいて整理しました。 www.bioerrorlog.work


参考

Deleting the Elastic Beanstalk Amazon S3 bucket - AWS Document