0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🌍 TerraformでCloudFrontのディストリビューションを設定するシンプルな手順

Last updated at Posted at 2025-02-09

📌 概要

Terraform を使って AWS の CloudFront を設定する方法 を解説します

📌 事前に準備するもの

main.tf

main.tf の作成がまだの方は以下の記事を参考にファイルを作成してください。

S3

S3のバケットを作成していない方は以下の記事を参考に作成します

📌 コード

resource "aws_cloudfront_origin_access_control" "origin_access_control" {
  name                              = "sample-domain-oac"
  description                       = "OAC for sample domain S3"
  origin_access_control_origin_type = "s3"
  signing_behavior                  = "always"
  signing_protocol                  = "sigv4"
}

resource "aws_cloudfront_distribution" "cloudfront_distribution" {
  enabled = true
  comment = "CloudFront for sample domain"

  origin {
    domain_name              = "sample.s3.amazonaws.com"
    origin_id                = "s3-sample"
    origin_access_control_id = aws_cloudfront_origin_access_control.origin_access_control.id
  }

  default_cache_behavior {
    target_origin_id         = "s3-sample"
    viewer_protocol_policy   = "redirect-to-https"
    allowed_methods          = ["GET", "HEAD"]
    cached_methods           = ["GET", "HEAD"]
    default_ttl              = 3600
    min_ttl                  = 0
    max_ttl                  = 86400

    forwarded_values {
      query_string = false
      cookies {
        forward = "none"
      }
    }
  }

  viewer_certificate {
    cloudfront_default_certificate = true
  }

  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }
}

data "aws_iam_policy_document" "s3_policy" {
  statement {
    sid = "AllowCloudFrontServicePrincipal"

    principals {
      type        = "Service"
      identifiers = ["cloudfront.amazonaws.com"]
    }

    actions = [
      "s3:GetObject"
    ]

    resources = [
      "${aws_s3_bucket.s3_bucket.arn}/*"
    ]

    condition {
      test     = "StringEquals"
      variable = "AWS:SourceArn"
      values   = [
        aws_cloudfront_distribution.cloudfront_distribution.arn
      ]
    }
  }
}

resource "aws_s3_bucket_policy" "s3_bucket_policy" {
  bucket = aws_s3_bucket.s3_bucket.id
  policy = data.aws_iam_policy_document.s3_policy.json
}

📌 CloudFront の OAC を作成

CloudFrontにS3へのアクセス権を与えます

resource "aws_cloudfront_origin_access_control" "origin_access_control" {
  name                              = "sample-domain-oac"
  description                       = "OAC for sample-domain S3"
  origin_access_control_origin_type = "s3"
  signing_behavior                  = "always"
  signing_protocol                  = "sigv4"
}

📌 CloudFront ディストリビューションの作成

resource "aws_cloudfront_distribution" "cloudfront_distribution" {
  enabled = true
  comment = "CloudFront for sample-domain"

  origin {
    domain_name              = "sample.s3.amazonaws.com"
    origin_id                = "s3-sample"
    origin_access_control_id = aws_cloudfront_origin_access_control.origin_access_control.id
  }

  default_cache_behavior {
    target_origin_id         = "s3-sample"
    viewer_protocol_policy   = "redirect-to-https"
    allowed_methods          = ["GET", "HEAD"]
    cached_methods           = ["GET", "HEAD"]
    default_ttl              = 3600
    min_ttl                  = 0
    max_ttl                  = 86400

    forwarded_values {
      query_string = false
      cookies {
        forward = "none"
      }
    }
  }

  # --- ACM 証明書未設定のため CloudFront デフォルト証明書を使用 ---
  viewer_certificate {
    cloudfront_default_certificate = true
    # acm_certificate_arn      = "arn:aws:acm:us-east-1:123456789012:certificate/xxxx-xxxx-xxxx"
    # ssl_support_method       = "sni-only"
    # minimum_protocol_version = "TLSv1.2_2021"
  }

  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }
}

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

「CloudFront だけが S3 にアクセスできる」ようにするポリシーを作ります 🔐✨

data "aws_iam_policy_document" "s3_policy" {
  statement {
    sid = "AllowCloudFrontServicePrincipal"

    principals {
      type        = "Service"
      identifiers = ["cloudfront.amazonaws.com"]
    }

    actions = [
      "s3:GetObject"
    ]

    resources = [
      "${aws_s3_bucket.s3_bucket.arn}/*"
    ]

    condition {
      test     = "StringEquals"
      variable = "AWS:SourceArn"
      values   = [
        aws_cloudfront_distribution.cloudfront_distribution.arn
      ]
    }
  }
}

resource "aws_s3_bucket_policy" "s3_bucket_policy" {
  bucket = aws_s3_bucket.s3_bucket.id
  policy = data.aws_iam_policy_document.s3_policy.json
}

📌 解説

S3 バケットの作成

aws_s3_bucket.sample は CloudFront のオリジンとなる S3 バケット です。

CloudFront の OAC(オリジンアクセス制御)を作成

aws_cloudfront_origin_access_control.origin_access_control は S3 との安全なアクセスを制御 します。

CloudFront ディストリビューションの作成

aws_cloudfront_distribution.cloudfront は S3 をオリジンとする CloudFront の CDN を作成 します。

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

aws_s3_bucket_policy.sample_policy は CloudFront からのみ S3 へアクセスを許可 するバケットポリシーです。

📌 実行

準備ができたら、以下の記事を参考にTerraform を実行しましょう!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?