同じ S3 バケットにプレフィックスを指定して複数の NLB アクセスログを設定する際に、「その名前のバケットを既に所有しています。」 のエラーなったときの対処方法。

困っていた内容

2つの NLB を所有しており、どちらも同様の S3 バケットにそれぞれのプレフィックスを指定して、 NLB アクセスログを有効にしたいです。

NLB アクセスログの設定で、1つ目の NLB のアクセスログの有効化は成功しましたが、2つ目の NLB のアクセスログを設定する際、 プレフィックスを含む S3 バケットを指定して「この場所を作成する」をクリックしましたが、「その名前のバケットを既に所有しています。」のエラーが発生しました。 対処方法を教えてください。

対象 NLB

  • NLB-DEV
  • NLB-STG

エラーが発生した時の画面

どう対応すればいいの?

2つ目の NLB アクセスログを有効化する際、「この場所を作成する」をクリックすると、S3バケットは 1つ目の NLB アクセスログを有効化する際に、 既に作成されているので、違うプレフィックスを指定してもエラーが発生します。

エラーを対処するためには、S3 のバケットポリシーを編集する必要がございます。

1つ目の NLB アクセスログを有効化する際に作成された S3バケットのバケットポリシーのリソースは以下 [1] となっておりますので、 既に存在しているプレフィックスのみ指定されております。
そのため、以下 [2] に変更する必要がございます。

[1] 変更前

"Resource": "arn:aws:s3:::nlb-log-blog/dev-test/AWSLogs/[アカウントID]/*"

[2] 変更後

"Resource": [
     "arn:aws:s3:::nlb-log-blog/dev-test/AWSLogs/[アカウントID]/*",
     "arn:aws:s3:::nlb-log-blog/stg-test/AWSLogs/[アカウントID]/*"
]

[2] に変更後、2つ目のNLBアクセスログ有効化の設定で「この場所の作成」をクリックせずに保存すると、 S3 バケットに2つ目のプレフィックスフォルダーが作成されます。

やってみた

変更前のバケットポリシー

{
    "Version": "2012-10-17",
    "Id": "AWSConsole-AccessLogs-Policy-1631232504909",
    "Statement": [
        {
            "Sid": "AWSConsoleStmt-1631232504909",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[アカウントID]:root"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::nlb-log-blog/dev-test/AWSLogs/[アカウントID]/*"
        },
        {
            "Sid": "AWSLogDeliveryWrite",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::nlb-log-blog/dev-test/AWSLogs/[アカウントID]/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        },
        {
            "Sid": "AWSLogDeliveryAclCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::nlb-log-blog"
        }
    ]
}

変更後のバケットポリシー

{
    "Version": "2012-10-17",
    "Id": "AWSConsole-AccessLogs-Policy-1631232504909",
    "Statement": [
        {
            "Sid": "AWSConsoleStmt-1631232504909",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[アカウントID]:root"
            },
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::nlb-log-blog/dev-test/AWSLogs/[アカウントID]/*",
                "arn:aws:s3:::nlb-log-blog/stg-test/AWSLogs/[アカウントID]/*"
            ]
        },
        {
            "Sid": "AWSLogDeliveryWrite",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::nlb-log-blog/dev-test/AWSLogs/[アカウントID]/*",
                "arn:aws:s3:::nlb-log-blog/stg-test/AWSLogs/[アカウントID]/*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        },
        {
            "Sid": "AWSLogDeliveryAclCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::nlb-log-blog"
        }
    ]
}

2つ目の NLBアクセスログ有効化の設定で「この場所の作成」をクリックせずに保存した後、S3バケットに2つ目のプレフィックスフォルダーが作成されます。

参考情報