電気ひつじ牧場

技術メモ

cloudfrontでログバケットにログが流れてこない

cloudfrontでコンテンツ配信をする際、Terraformであれば次のようにlogging_configを指定することでアクセスログを残すことができる。

resource "aws_cloudfront_distribution" "example" {
  ...
  logging_config {
    bucket = aws_s3_bucket.cloudfront_log.bucket_domain_name
    prefix = "log/"
  }
  ...
}

resource "aws_s3_bucket" "cloudfront_log" {
  bucket = "cloudfront-log"
  versioning {
    enabled = true
  }
}

ただし、このままではバケットにログが送信されて来なかった。

原因はアクセス権限不足。ドキュメントにある通り、awslogsdeliveryアカウントのACLアクセス許可が必要だった。

ログバケットでは次のように指定する。

resource "aws_s3_bucket" "cloudfront_log" {
  bucket = "cloudfront-log"
  versioning {
    enabled = true
  }
  grant {
    // awslogsdeliveryのアカウントID
    // https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html
    id = "c4c1ede66af53448b93c283ce9448c4ba468c9432aa01d700d3878632f77d2d0"
    permissions = [
      "FULL_CONTROL",
    ]
    type = "CanonicalUser"
  }
}