マネジメントコンソールでALBのアクセスログを有効化してみる

2024.03.29

はじめに

ALBのアクセスログ(以下ログといいます)を取得する際に、ちょっとだけ詰まりました。
ちょっとだけですよ...
最初はログの出力先さえ設定すれば、あとはALBのログを有効化して勝手にログを吐き出すだろう。くらいのイメージでしたが、それなりに設定が必要だったので記事にしたいと思います。

ALBのアクセスログ取得の流れ

ALBのログ取得は以下の順番で設定します。

  • ログ用のS3バケットを作成する
  • バケットポリシーを設定する
  • ALBのアクセスログを有効化する
  • 出力先のバケットを指定する

S3バケット作成

まずはALBのログを保管するためのS3バケットを作成します。
名前は適当でいいです。
今回はバケット名をalb-access-log-bucket-20240329として、その他はデフォルト値で作成します。

バケットポリシー設定

次にバケットポリシーを設定します。
アクセス許可>バケットポリシーの順で進みます。

バケットポリシーを設定する際、ALBがどのリージョンに存在するかで設定内容が変わります。

パターン1:2022年8月以降に利用可能になったリージョン(新しいリージョン)
パターン2:2022年8月より前に利用可能になったリージョン(昔からあるリージョン)

今回作業するのは東京リージョンなのでパターン2の方です。
このあたり詳しくはドキュメントに一覧が記載されているので、そちらを参考にして下さい。

パターン2は以下のようにバケットポリシーを設定します。

{
  "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/aws-account-id/*"
    }
  ]
}

バケットポリシー内にelb-account-idとありますが、こちらは固有の値があります。
私がよく使うリージョンをいくつか例に出します

  • 米国東部 (バージニア北部) – 127311923021
  • アジアパシフィック (大阪) – 383597477331
  • アジアパシフィック (東京) — 582318560864

他のリージョンについてもドキュメントに一覧が記載されています。

例えば今回の場合だと以下のようなポリシーになります。
my-albの部分はALBの名前など、識別できる値を入れてください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::582318560864:root"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::alb-access-log-bucket-20240329/my-alb/AWSLogs/<account-id>/*"
    }
  ]
}

アクセスログ有効化

ログの保管場所が用意できたのでALBのログを有効化します。
ALB>属性タブ>編集の順に進みます

モニタリング項目のアクアセスログを有効にします。
S3 URIを直接入力します。

形はs3://<bucket-name>/prefixです。
今回の場合は以下のようになります。

s3://alb-access-log-bucket-20240329/my-alb/

my-alb以降のプレフィックスについては、ログ保存時に自動的に作成されます。
複数のALBを使用している場合はmy-albの部分をALBの名前など、識別しやすい値に変えてください。

それではログを有効化します。
アクセスログが有効化されていることが分かります。

ログの確認

バケットにログが保存されているか確認しましょう。
最初に作成したバケットへ移動します。

バケットを開くと自動的にログテストファイルが保存されていることが分かります。
また、my-alb以降のprefixが自動的に作成されていることも確認できます。

詰まりそうなところ

S3 URI入力

ALBでログ出力先のS3 URIを入力する際、プレフィックスを誤るとpermissionエラーになります。
ドキュメントをよく見てないと間違いやすい部分かなと思います。
s3://<bucket-name>/<prefix>/になっていることを確認しましょう。

複数のALBのログを集約する場合

ALBが複数ある場合、1つのバケットにアクセスログを集約したいケースもあるかと思います。
ALBのアクセスログ専用バケットとして使用する場合、操作はs3:PutObjectに限定されているため、ログが漏洩する心配はありません。
その場合はバケットポリシーのResourceを制限せずに

"Resource": "arn:aws:s3:::alb-access-log-bucket-20240329/*"

とすることで任意のprefix、つまり複数のALBからログを格納することができます。

この場合もS3 URIは以下のように設定します。

s3://alb-access-log-bucket-20240329/<prefix>/

<prefix>にはALBの名前など、識別しやすい値を入力します。

まとめ

バケットとバケットポリシーの作成はこちらの記事で紹介されているCloudFormationテンプレートを使えば簡単に作成できるので、よければ合わせて使ってみて下さい!