ALBのログをS3に保存するときにパーミッションエラー

terraformでALBのログをS3に保存する設定を記述し、適用しようとしたら以下の様なエラーが発生した。

Error: Failure configuring LB attributes: InvalidConfigurationRequest:
Access Denied for bucket: foo-alb-log. Please check S3bucket permission
	status code: 400, request id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  on alb.tf line 1, in resource "aws_lb" "example":
   1: resource "aws_lb" "example" {

原因

上記エラーの原因はメッセージの通り、パーミッションが付与されていないため。
バケットにアクセスログを書き込む許可をALBに与える必要がある。

対処法

ALBのログをS3に保存する場合、許可が必要なアカウントIDはリージョンごとに決まっている。
東京リージョンの場合は582318560864に対して許可する。

resource "aws_s3_bucket" "example" {
  bucket = "バケット名"
}

resource "aws_s3_bucket_policy" "example" {
  bucket = aws_s3_bucket.alb_log.id 
  policy = data.aws_iam_policy_document.example.json
}

data "aws_iam_policy_document" "example" {
  statement {
    effect    = "Allow"
    actions   = ["s3:PutObject"]
    resources = ["arn:aws:s3:::${aws_s3_bucket.example.id}/*"]
    principals {
      type = "AWS"
      identifiers = ["582318560864"] # AWS の東京リージョンのアカウントIDを許可
    }
  }
}

リージョンごとに許可が必要なAWSアカウントは異なるので、ALBを配置したリージョンのAWSアカウントを調べる必要がある。

参考: Application Load Balancerのアクセスログを有効にする

2023年3月時点では以下の通り。

リージョンリージョン名アカウントID
米国東部 (バージニア北部)us-east-1127311923021
米国東部 (オハイオ)us-east-2033677994240
米国西部 (北カリフォルニア)us-west-1027434742980
米国西部 (オレゴン)us-west-2797873946194
アフリカ (ケープタウン)af-south-1098369216593
アジアパシフィック (香港)ap-east-1754344448648
アジアパシフィック (ジャカルタ)ap-southeast-3589379963580
アジアパシフィック (ムンバイ)ap-south-1718504428378
アジアパシフィック (東京)ap-northeast-1582318560864
アジアパシフィック (ソウル)ap-northeast-2600734575887
アジアパシフィック (大阪)ap-northeast-3383597477331
アジアパシフィック (シンガポール)ap-southeast-1114774131450
アジアパシフィック (シドニー)ap-southeast-2783225319266
カナダ (中部)ca-central-1985666609251
欧州 (フランクフルト)eu-central-1054676820928
欧州 (アイルランド)eu-west-1156460612806
欧州 (ロンドン)eu-west-2652711504416
欧州 (パリ)eu-west-3009996457667
欧州 (ミラノ)eu-south-1635631232127
欧州 (ストックホルム)eu-north-1897822967062
中東 (バーレーン)me-south-1076674570225
南米 (サンパウロ)sa-east-1507241528517