🐼

ALBのアクセスログをS3バケットへ保存するように設定して、terraform実行すると権限エラー

2022/01/20に公開

はじめに

ロードバランサーをterraformで作成しようとしたら、権限エラーに苦しまされたので、備忘録として記します。

エラー内容

こんな感じのエラーがでました。(参考記事から抜粋してきました)

Error: Failure configuring LB attributes: InvalidConfigurationRequest: Access Denied for bucket: hogehoge-alb-log. Please check S3bucket permission
	status code: 400, request id: b5a93fcd-a022-4e82-9fc1-a43367962638
  on alb.tf line 8, in resource "aws_lb" "example":
   8: resource "aws_lb" "example" {

[参考]
https://hodalog.com/resolve-the-problem-of-accessing-denied-from-alb-to-s3/

なぜエラーになったか

s3バケット側で、ALBからのアクセスを許可をする際に、アカウントIDの指定方法を間違えていました。正直参考記事と全く同じ現象だったのですが、下記部分が理解できなくて苦しみました。

ロードバランサーのリージョンに対応する AWS アカウント ID を指定します。

[参考]
https://hodalog.com/resolve-the-problem-of-accessing-denied-from-alb-to-s3/

ロードバランサーのリージョンに対応するAWSアカウントIDとは

下記公式を確認することで、解決しました。
ロードバランサーのリージョンに対応するAWSアカウントIDとは、要するに、S3のバケットポリシーで使用するアカウントIDのことのようです。
AWSアカウントを作成時に割り当てられるアカウントIDとは別物です。
執筆時点で、東京リージョンのアカウントIDは、582318560864でした。

[公式]
https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/enable-access-logs.html#attach-bucket-policy

最終的に出来上がったもの

s3バケットのコード

# ログバケットの作成
resource "aws_s3_bucket" "alb_log" {
  bucket = "alb-log-pragmatic-terraform-sample"

  # ラウフサイクルルールの設定
  lifecycle_rule {
    enabled = true
    # 180日経過したファイルを自動削除
    expiration {
      days = "180"
    }
  }
}

# バケットポリシー
resource "aws_s3_bucket_policy" "alb_log" {
  bucket = aws_s3_bucket.alb_log.id
  policy = data.aws_iam_policy_document.alb_log.json
}

data "aws_iam_policy_document" "alb_log" {
  statement {
    effect = "Allow"
    actions = ["*"]
    resources = ["arn:aws:s3:::${aws_s3_bucket.alb_log.id}/*"]
    principals {
      type = "AWS"
      # ここにロードバランサーのリージョンに対応する AWSアカウントIDを記載する
      identifiers = ["582318560864"]
    }
  }
}

ロードバランサー

### ロードバランサー
resource "aws_lb" "example" {
  ## 中略
  # アクセスログ
  access_logs {
    # バケット名を指定
    bucket = aws_s3_bucket.alb_log.id 
    enabled = true
  }
}

Discussion