ALBのアクセスログを有効にする際、Access Deniedになった時にS3バケットで確認するポイント

アクセスログ用のS3バケットを作成し、ALBのアクセスログを出力設定をすると、Access Denied というエラーに遭遇しました。解決するために、確認するポイントをまとめました。
2023.03.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

ALBのアクセスログをS3バケットに出力するために、ALBを設定変更すると、Access Deniedと表示されました。

Access Denied for bucket: <バケット名>. Please check S3bucket permission

このエラーを対処するために、S3バケット側で確認するポイントをご説明します。

前提条件

以下の2つのリソースを作成済み

  • ALBの作成
    • ALB名:test
    • リージョン:東京リージョン
  • S3バケット
    • バケット名:alb-accesslog-20230322
    • リージョン:東京リージョン

KMSキーが適切か

S3バケットのサーバー側の暗号化キーがAmazon S3 マネージドキー(SSE-S3) であるかどうかです。

ドキュメントにも記載がありますが、ELBのアクセスログに対して、サーバー側の暗号化キーは、SSE-S3のみをサポートしています。

サポートされている唯一のサーバー側の暗号化オプションは、Amazon S3 マネージドキー (SSE-S3) です
アクセスログ用のバケットの要件

SSE-KMSは、サポートしてしていませんので、している場合は、SSE-S3に変更しましょう。

バケットの[デフォルトの暗号化]から変更できます。

SSE-S3に変更しました!

ALBとS3バケットは、同一リージョンか

2つのリソースが同一リージョンである必要があります。

もし別リージョンで作成していた場合、同一リージョンに変更しましょう。

バケットは、ロードバランサーと同じリージョンに配置されている必要があります。 アクセスログ用のバケットの要件

S3バケットポリシーは適切か

ALBからのアクセスログが出力されるよう、バケットポリシーで許可する設定が必要です。

必要なバケットポリシーの設定は、下記のドキュメントに記載がありました。

アクセスログ用のバケットポリシーで必要な設定

東京リージョンの場合、以下のポリシーを設定する必要があります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::elb-account-id:root"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::bucket-name/prefix/AWSLogs/your-aws-account-id/*"
    }
  ]
}

elb-account-idは、ロードバランサーのリージョンに対応するAWSアカウントIDを設定する必要があります。

そのためelb-account-idは、自分のアカウントIDではないことに注意して下さい

elb-account-idは、ドキュメントにも記載がありますが、東京リージョンの場合、582318560864でした。

今回の構築のバケットポリシーは以下の様に設定しました。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::582318560864:root"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::alb-accesslog-20230322/*"
    }
  ]
}

アクセスログの出力先のパスは、/にしております。

他のリージョンの場合

ちなみに、下記のリージョンの場合、先程のバケットポリシーとは異なるので、注意して下さい。

  • アジアパシフィック (ハイデラバード)
  • アジアパシフィック (メルボルン)
  • 欧州 (スペイン)
  • 欧州 (チューリッヒ)
  • 中東 (アラブ首長国連邦)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "logdelivery.elasticloadbalancing.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::bucket-name/prefix/AWSLogs/aws-account-id/*"
    }
  ]
}

ロードバランサーのリージョンに対応するAWSアカウントIDは、不要のようですね。

確認後

確認ポイントを修正し、再度アクセスログを有効に設定すると、有効化できました!

参考になれば幸いです。