本日も乙

ただの自己満足な備忘録。

ELBのアクセスログを別AWSアカウントにあるS3バケットに保存する

AWSのELBにはアクセスログをS3に保存できる機能が提供されています。

Classic Load Balancer のアクセスログ - Elastic Load Balancing
Application Load Balancer のアクセスログ - Elastic Load Balancing

このアクセスログをELBを持っているAWSアカウントとは別のAWSアカウントに保管したい場合があると思います。例えば、ログを保管・解析する専用のAWSアカウントに集約するなどです。

ドキュメントでは以下のように記載されているのですが、ドキュメントには詳細の設定方法が記載されておらずググっても欲しい情報に辿りつくことができませんでした。

バケットとロードバランサーは同じリージョンに存在する必要があります。バケットは、ロードバランサーを所有するアカウントとは別のアカウントが所有するものでもかまいません。

サポートに問い合わせて設定できたのでその方法を紹介します。今回はCLB(Classic Load Balancer)で設定しましたが、ALB(Application Load Balancer)でも同様にできると思います。

構成

アカウントA (AWSアカウントID: 111111111111)

  • ELBを所有しているアカウント
  • ELBのリージョン: 東京(ap-northeast-1)

アカウントB (AWSアカウントID: 222222222222)

  • アクセスログを保存したいS3バケットを所有しているアカウント
  • S3バケットのリージョン: 東京(ap-northeast-1)
    • ELBと同じリージョンに合わせる必要がある

S3バケットのポリシーの設定

設定方法はS3バケットを作成し、以下のようなポリシーを作成すれば良いだけです。

{
    "Version": "2012-10-17",
    "Id": "Policy1429136655940",
    "Statement": [
        {
            "Sid": "Allow_ELB_Access_logs_Other_Account",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111111111111:root",
                    "arn:aws:iam::582318560864:root"
                ]
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<S3バケット名>/*/AWSLogs/111111111111/*"
        }
    ]
}

582318560864 はElastic Load Balancing アカウント IDで、AWS側でリージョン毎に定められています。ステップ 2: S3 バケットにポリシーをアタッチするを参考に該当リージョンのアカウントIDを設定します。

それに加え、アカウントID: 111111111111が、アカウントID: 222222222222が所有しているS3バケットにアクセスできるように arn:aws:iam::111111111111:root を追加しています。

保存先のS3パスは arn:aws:s3:::<S3バケット名>//AWSLogs/<ELB所有アカウントID>/ にする必要があります。

S3バケットのポリシーが設定できたら、ステップ 3: アクセスログを有効にするを参考に設定し、アクセスログが保存されていればOKです。

最後に

S3バケットのポリシー設定だけなのでなんてことないですが、わかるようになるまで時間がかかりますし、AWSに詳しくない人は設定にハマってしまうかもしれません。もっと簡単にできればいいですね。

参考