ALBのアクセスログをS3バケットへ保存するようにTerraform実行したら「権限がないよ」と怒られた件

ALBのアクセスログをS3のバケットに保存できるようにしたかったのですが、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" {

アカウントIDの指定を間違えていただけだったのですが、またハマるかもしれないのでメモを残します。

パーミッションエラーとなっていた原因

ALBのログを保存するためのS3のバケットを、下記のように設定していました。

resource "aws_s3_bucket" "alb_log" {
  bucket        = "hogehoge-alb-log"
  force_destroy = true

  // lifecycle_rule is an option to define lifecycle rule.
  // Here, files that are 180 days old will be automatically deleted.
  lifecycle_rule {
    enabled = true

    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
}

// "aws_iam_policy_document" defines access right from sercvices of AWS such as ALB to S3.
data "aws_iam_policy_document" "alb_log" {
  statement {
    effect    = "Allow"
    actions   = ["s3:PutObject"]
    resources = ["arn:aws:s3:::${aws_s3_bucket.alb_log.id}/*"]

    // The identifiers is the account ID. This is not your AWS account ID.
    // https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/enable-access-logs.html
    principals {
      type        = "AWS"
      identifiers = ["582318560864"]
    }
  }
}

ここでALBからS3へのアクセスポリシーを aws_iam_policy_document というresourceで定義しているのですが、この中の identifiers という項目で自分のAWSアカウントのIDを指定しまっていたのが原因でした。

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

新しいバケットポリシーを作成する場合は、このポリシードキュメント全体をポリシーエディタにコピーし、プレースホルダーをお客様のバケットのバケット名とプレフィックス、ロードバランサーのリージョンに対応する AWS アカウント ID に置き換えます。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/enable-access-logs.html

まとめ

GCP、AWSなどのパブリッククラウド系のサービスはフロントエンド並にアップデートが激しく、常に新しい情報をキャッチアップするのは大変です。

しかし重要な技術分野の一つなので、インスタンスやロードバランサー、ストレージなどの基本的なサービスやアーキテクチャを抑えつつ、仕事で活用していきたいと思います。