1
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?

S3 + CloudFront + ACM + Route53を使用した静的ファイル配信システムをTerrafoemを使用して構築

Posted at

前書き

Web サイトやアプリケーションを運用する際、静的ファイル(HTMLCSSJavaScript、画像など)を安全に、そして高速に配信する仕組み は欠かせません。AWSでは、この仕組みを実現するために以下のサービスを組み合わせて利用できます。

  • Amazon S3:静的ファイルを保存するストレージ
  • Amazon CloudFront:世界中に配置されたエッジサーバーからファイルをキャッシュ配信する CDN(Content Delivery Network) サービス
  • AWS Certificate Manager(ACM)HTTPS通信に必要なSSL/TLS証明書を管理するサービス
  • Amazon Route53:独自ドメインを管理し、CloudFrontへアクセスを振り分けるDNSサービス

さらに、これらのリソースをTerraformを用いてコード化(Infrastructure as Code, IaC)することで、環境を自動で構築・管理できるようになります。手作業で AWSコンソールから設定するよりも効率的で、再現性の高いインフラを作れるのが大きなメリットです。

この記事では、S3CloudFrontACMRoute53を組み合わせた静的ファイル配信システムを Terraformで構築する方法を順を追って解説します。

Amazon CloudFrontの概要

  • CDN(コンテンツ配信ネットワーク)サービスであり、低遅延・高速な配信を実現する仕組み
  • 世界中のエッジサーバーを経由し、ユーザーに最も近い場所からコンテンツを届けることで読み込み時間を短縮しパフォーマンスを向上させる
  • 静的・動的コンテンツや API、動画など幅広いコンテンツを配信できる(HTML・CSS・画像・動画・アプリ・API などに対応)
  • 高いセキュリティを備える(HTTPS配信フィールドレベル暗号化AWS ShieldAWS WAF による DDoS(分散型サービス拒否攻撃) 対策や攻撃防御を実装可能)
  • CloudFront FunctionsLambda@Edge によるエッジ処理が可能(JavaScript コードをユーザーに近い場所で実行し、リクエスト振り分けやヘッダー操作を実現)

前提条件

構築内容

ディレクトリー構成

.
├── evironments/
│   ├── dev/
│   │   ├── .terraform # ⇦ 自動生成
│   │   ├── .terraform.lock.hcl # ⇦ 自動生成
│   │   ├── backend.tf
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   └── variables.tf
│   ├── prd
│   └── stg
├── modules/
│   ├── acm/
│   │   ├── acm.tf
│   │   ├── output.tf
│   │   └── variables.tf
│   ├── cloudfront/
│   │   ├── files/
│   │   │   └── rewrite_root.js
│   │   ├── cloudfront.tf
│   │   ├── output.tf
│   │   └── variables.tf
│   ├── dynamodb/
│   │   ├── dynamodb.tf
│   │   └── variables.tf
│   ├── route53/
│   │   ├── route53.tf
│   │   └── variables.tf
│   ├── s3/
│   │   └── static_file_delivery_s3/
│   │       ├── files/
│   │       │   └── html/
│   │       │       └── index.html
│   │       ├── output.tf
│   │       ├── static_file_delivery_s3.tf
│   │       └── variables.tf
│   └── tfstate_management/
│       ├── tfstate_management.tf
│       └── variables.tf
└── .gitignore

environments内の設定ファイル

main.tf
# S3(tfvars_management)
module "s3" {
  source = "../../modules/s3/tfstate_management"

  env         = local.env
  name_prefix = local.name_prefix
}

# DynamoDB
module "dynamodb" {
  source = "../../modules/dynamodb"

  env         = local.env
  name_prefix = local.name_prefix
}


# S3
module "static_file_delivery_s3" {
  source = "../../modules/s3/static_file_delivery_s3"

  env         = local.env
  name_prefix = local.name_prefix

  # cloudfront
  origin_access_identity_iam_arn = module.cloudfront.origin_access_identity_iam_arn
}

# ACM
module "acm" {
  source = "../../modules/acm"

  # 共通
  env         = local.env
  name_prefix = local.name_prefix

  # ゾーンID、ゾーン名
  zone_id   = local.zone_id
  zone_name = local.zone_name
}

# Route53
module "route53" {
  source = "../../modules/route53"

  env         = local.env
  name_prefix = local.name_prefix

  # cloudfront関連
  cloudfront_static_file_delivery_domain_name   = module.cloudfront.cloudfront_static_file_delivery_domain_name
  cloudfront_static_file_delivery_hosted_zone_id = module.cloudfront.cloudfront_static_file_delivery_hosted_zone_id

  # サブドメイン名
  app_subdomain_name = local.app_subdomain_name

  # ゾーンID
  zone_id = local.zone_id
}

# CloudFront
module "cloudfront" {
  source = "../../modules/cloudfront"

  env         = local.env
  name_prefix = local.name_prefix
  tokyo_region = local.tokyo_region

  # ACM関連
  acm_certificate_virginia_test_com_arn = module.acm.acm_certificate_virginia_test_com_arn

  # S3関連
  static_file_delivery_website_domain = module.static_file_delivery_s3.static_file_delivery_website_domain

  # サブドメイン名
  app_subdomain_name = local.app_subdomain_name

  # ゾーン名
  zone_name = local.zone_name
}
variables.tf
# 現在のAWSアカウント情報を取得する
data "aws_caller_identity" "current" {}
locals {
  aws_account_id = data.aws_caller_identity.current.account_id
}

# 共通
locals {
  env          = # 環境名
  name_prefix  = "static-file-delivery-system"
  tokyo_region = "ap-northeast-1"
}

# Route53 ゾーン情報を取得
data "aws_route53_zone" "host_zone" {
  name = "matsuno-test.com"
}
locals {
  zone_id   = data.aws_route53_zone.host_zone.zone_id
  zone_name = data.aws_route53_zone.host_zone.name

  # サブドメイン名
  app_subdomain_name = "app" 
}

modules内の設定ファイル

  • 下記に示す設定をmodules内に記載する

ACM(AWS Certificate Manager)

  • CloudFront が利用できる証明書は、「バージニア北部(us-east-1)」で発行した ACM 証明書だけに限定されている
  • 東京リージョンや大阪リージョンで証明書を発行しても、CloudFront では使えない
acm.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "6.10.0"
    }
  }
}

provider "aws" {
  alias  = "virginia"
  region = "us-east-1"
}

# ACM 証明書を発行
resource "aws_acm_certificate" "virginia_test_com" {
  provider          = aws.virginia
  domain_name       = local.hostname
  validation_method = "DNS"
}

# DNSの検証
resource "aws_acm_certificate_validation" "virginia_test_com" {
  provider        = aws.virginia
  certificate_arn = aws_acm_certificate.virginia_test_com.arn
  validation_record_fqdns = [
    for record in aws_route53_record.virginia_test_com : record.fqdn
  ]
}

# Route53 に DNS 検証レコードを登録する
resource "aws_route53_record" "virginia_test_com" {
  for_each = {
    for dvo in aws_acm_certificate.virginia_test_com.domain_validation_options :
    dvo.domain_name => dvo
  }

  zone_id = var.zone_id
  name    = each.value.resource_record_name
  type    = each.value.resource_record_type
  ttl     = 60
  records = [each.value.resource_record_value]
}

メソッドと説明

aws_acm_certificate_validationで使用したメソッドと説明
メソッド 説明
provider 利用する AWS のプロバイダを指定する。ここでは aws.virginia を指定して、バージニアリージョンで処理する
certificate_arn 事前に発行した ACM 証明書の ARN を指定する。どの証明書を検証するかを決める
validation_record_fqdns Route53 に作成された検証用レコードの FQDN を指定する。これにより証明書の検証を自動で行う

用語説明

  • FQDN(Fully Qualified Domain Name): インターネット上で特定のサーバーやサービスを一意に特定する完全なドメイン名。例:www.example.com のように、ドットで区切られた全階層を含んで表す
aws_route53_recordで使用したメソッドと説明
メソッド 説明
for_each domain_validation_options をループして、検証用の DNS レコードをドメインごとに作成する。
zone_id DNS レコードを作成する Route53 のゾーンIDを指定する。
name 作成するレコード名を指定する。ACM が要求する検証用の名前が入る。
type レコードの種類を指定する。ACM の検証では通常 CNAME が入る。
ttl レコードの有効期限(キャッシュ時間)を秒単位で指定する。ここでは60秒としている。
records レコードの値を指定する。ACM が要求する検証用の値が入る。

用語説明

  • CNAME(Canonical Name Record): DNS レコードの一種で、あるドメイン名を別の正規ドメイン名へ紐付けるために使う。いわゆる「別名(エイリアス)」を設定するための仕組み
  • DNS(Domain Name System): ドメイン名(例:example.com)を IP アドレス(例:192.0.2.1)に変換する仕組み。インターネットの「住所録」のような役割を持つ
variables.tf
variable "env" { type = string }
variable "name_prefix" { type = string }
variable "zone_id" { type = string }
variable "zone_name" { type = string }

# prd のときは空、それ以外は ".${var.env}"
locals {
  env_suffix = var.env == "prd" ? "" : ".${var.env}"
  hostname   = "*${local.env_suffix}.${var.zone_name}"
}
  • aws_acm_certificate リソースで作成した ACM 証明書の ARN(Amazon Resource Name) を出力
output.tf
output "acm_certificate_virginia_test_com_arn" {
  value = aws_acm_certificate.virginia_test_com.arn
}

S3

static_file_delivery_s3.tf
# S3バケットの作成
resource "aws_s3_bucket" "static_file_delivery" {
  bucket        = "${var.env}-${var.name_prefix}"
}

# 静的ウェブサイトホスティングの設定
resource "aws_s3_bucket_website_configuration" "website" {
  bucket = aws_s3_bucket.static_file_delivery.id

  index_document {
    suffix = "index.html"
  }
}

# CORSの設定
resource "aws_s3_bucket_cors_configuration" "static_file_delivery_cors" {
  bucket = aws_s3_bucket.static_file_delivery.id

  cors_rule {
    allowed_headers = ["*"]
    allowed_methods = ["GET"]
    allowed_origins = ["*"]
    expose_headers  = ["ETag"]
    max_age_seconds = 3000
  }
}

# index.html をアップロード(ループ処理にて、files/html 配下の全てのファイルをアップロード)
resource "aws_s3_object" "html_files" {
  for_each               = local.html_map
  bucket                 = aws_s3_bucket.static_file_delivery.id
  key                    = "html/${each.key}"
  source                 = each.value
  source_hash            = filemd5(each.value)
  content_type           = "text/html"
  server_side_encryption = "AES256"
}

# CloudFront の OAI(Origin Access Identity)のみが S3 にアクセスできるようにするポリシーを作成
data "aws_iam_policy_document" "allow_cloudfront" {
  statement {
    effect = "Allow"
    principals {
      type        = "AWS"
      identifiers = [var.origin_access_identity_iam_arn]
    }
    actions   = ["s3:GetObject"]
    resources = ["${aws_s3_bucket.static_file_delivery.arn}/*"]
  }
}

# aws_iam_policy_documentで構築したポリシーをS3バケットに適用する
resource "aws_s3_bucket_policy" "only_cloudfront" {
  bucket = aws_s3_bucket.static_file_delivery.id
  policy = data.aws_iam_policy_document.allow_cloudfront.json
}

メソッドと説明

aws_s3_bucket_website_configurationで使用したメソッドと説明
メソッド 説明
bucket 静的ウェブサイトとして公開する対象の S3 バケットを指定する
index_document.suffix ルートアクセス時に返すデフォルトのファイル名を指定する(例:index.html を返す)
aws_s3_bucket_cors_configurationで使用したメソッドと説明
メソッド 説明
bucket CORS 設定を適用する S3 バケットを指定する
cors_rule.allowed_headers クライアントから送信を許可するリクエストヘッダーを指定する("*" で全て許可)
cors_rule.allowed_methods 許可する HTTP メソッドを指定する(ここでは GET のみ許可)
cors_rule.allowed_origins アクセス元オリジンを指定する("*" で全てのオリジンを許可)
cors_rule.expose_headers ブラウザに公開するレスポンスヘッダーを指定する(例:ETag を参照可能にする)
cors_rule.max_age_seconds プリフライト結果をキャッシュする秒数を指定する

用語説明

  • CORS(Cross-Origin Resource Sharing) : 異なるオリジン(ドメインやポートが違う場所)からのアクセスを許可する仕組み
  • リクエストヘッダー(Request Header) : ブラウザやクライアントがサーバーに送る追加情報(例:利用言語や認証情報など)
  • オリジン(Origin) : URL を構成する「スキーム(http/https)+ドメイン+ポート」の組み合わせ。アクセス元を特定する単位
  • ETag(Entity Tag) : サーバーが返すレスポンスに付く識別子。ファイルの変更有無を判断するために使う
aws_s3_object(html_files)で使用したメソッドと説明
メソッド 説明
for_each local.html_map の全ファイルをループして S3 にアップロードする
bucket アップロード先の S3 バケットを指定する
key S3 上のオブジェクトキー(保存パス)を指定する(例:html/ファイル名 で配置する)
source ローカルファイルのパスを指定する
source_hash ファイルのハッシュを指定して差分時のみ更新する(filemd5 で内容の変更を検知する)
content_type コンテンツタイプを指定する(HTML を配信するため text/html を設定する)
server_side_encryption サーバー側暗号化方式を指定する(SSE-S3AES256 を利用する)
data "aws_iam_policy_document"(allow_cloudfront)で使用したメソッドと説明
メソッド 説明
statement.effect ポリシーの効果を指定する(Allow で許可を与える)
statement.principals.type プリンシパルの種類を指定する(AWS を指定して IAM エンティティを対象にする)
statement.principals.identifiers 許可対象の IAM エンティティを指定する(CloudFront OAIIAM ARN を指定する)
statement.actions 許可するアクションを指定する(S3 オブジェクトの取得 s3:GetObject を許可する)
statement.resources ポリシーの適用対象リソースを指定する(対象バケット配下の全オブジェクトを指定する)

用語説明

  • プリンシパル(Principal) : 「この操作をする人やサービスは誰か」を示すもの
  • IAM エンティティ(IAM Entity) : AWS IAM(AWS Identity and Access Management) で管理される認証対象を示す。ユーザー(人)やロール(権限を持つ役割)などを指す
  • `S3 オブジェクト(S3 Object)** : S3 バケットの中に保存されるファイルやデータ。実体はファイル本体とメタデータ(属性情報)で構成される
variables.tf
variable "env" { type = string }
variable "name_prefix" { type = string }

# cloudfront
variable "origin_access_identity_iam_arn" { type = string }

locals {
  # HTML ファイルを配置しているルートディレクトリのパスを設定
  html_root = "${path.module}/files/html"

  # 指定ディレクトリ配下にあるすべてのファイルを取得(files/html 配下の一覧)
  html_files = fileset("${path.module}/files/html", "**")

  # ファイル名をキー、フルパスを値とするマップを作成
  # 例: "index.html" => "/terraform/module/files/html/index.html"
  html_map = { for f in local.html_files : f => "${local.html_root}/${f}" }
}
output.tf
output "static_file_delivery_website_domain" {
  description = "S3 静的ウェブサイトホスティング用ドメイン名"
  value       = aws_s3_bucket_website_configuration.website.website_domain
}
  • files/html/index.htmlに下記を記述する
<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>S3 静的サイト デモ</title>
  <style>
    body{font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Noto Sans JP","Hiragino Kaku Gothic ProN","Yu Gothic",sans-serif;line-height:1.6;margin:0;background:#f7f7f7}
    main{max-width:720px;margin:10vh auto;background:#fff;padding:2rem;border-radius:12px;box-shadow:0 2px 12px rgba(0,0,0,.06);text-align:center}
    h1{margin:0 0 .25rem;font-size:1.5rem}
    p{margin:.25rem 0;color:#555}
    small{color:#777}
  </style>
</head>
<body>
  <main>
    <h1>デモページ</h1>
    <p>S3 にアップロードした htmlファイルを表示しています。</p>
  </main>
</body>
</html>

CloudFront

cloudfront.tf
resource "aws_cloudfront_distribution" "static_file_delivery" {
  origin {
    domain_name = "${var.env}-${var.name_prefix}.s3.${var.tokyo_region}.amazonaws.com"
    origin_id   = "${var.env}-${var.name_prefix}"

    # CloudFront からのみ S3 にアクセスさせる為、 Origin Access Identity(OAI)を設定
    s3_origin_config {
      origin_access_identity = aws_cloudfront_origin_access_identity.oai.cloudfront_access_identity_path
    }
  }

  enabled             = true
  is_ipv6_enabled     = true
  default_root_object = "html/index.html"

  aliases = [
    "${local.app_hostname}.${var.zone_name}"
  ]

  default_cache_behavior {
    target_origin_id       = "${var.env}-${var.name_prefix}"
    viewer_protocol_policy = "redirect-to-https"
    allowed_methods        = ["GET", "HEAD"]
    cached_methods         = ["GET", "HEAD"]
    default_ttl            = 0
    max_ttl                = 0
    min_ttl                = 0

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

    function_association {
      event_type   = "viewer-request"
      function_arn = aws_cloudfront_function.rewrite_root.arn
    }
  }

  # 独自ドメインを使用する為の設定
  viewer_certificate {
    acm_certificate_arn      = var.acm_certificate_virginia_test_com_arn
    ssl_support_method       = "sni-only"
    minimum_protocol_version = "TLSv1.2_2021"
  }

  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }

  custom_error_response {
    error_code            = 404
    response_code         = 200
    response_page_path    = "/html/index.html"
    error_caching_min_ttl = 0
  }
  custom_error_response {
    error_code            = 403
    response_code         = 200
    response_page_path    = "/html/index.html"
    error_caching_min_ttl = 0
  }
}

# CloudFront 経由でのみ S3 にアクセスさせるための特別なユーザー(OAI)
resource "aws_cloudfront_origin_access_identity" "oai" {
  comment = "CloudFront 経由のみで S3 にアクセスさせるための識別子(ユーザー)"
}

# CloudFront Function
resource "aws_cloudfront_function" "rewrite_root" {
  name    = "${var.env}-${var.name_prefix}-cloudfront-function"
  runtime = "cloudfront-js-2.0"
  code    = file("${path.module}/files/rewrite_root.js")
}

メソッドと説明

aws_cloudfront_distributionで使用したメソッドと説明
メソッド 説明
origin.domain_name 配信元の S3 バケットのドメイン名を指定する
origin.origin_id CloudFront内で一意に識別するためのIDを指定する
origin.s3_origin_config.origin_access_identity OAI(Origin Access Identity)を設定し、CloudFront経由でのみS3にアクセスできるようにする
enabled ディストリビューション(CloudFront でコンテンツ配信を行う仕組み全体の単位)を有効化するかどうかを指定する
is_ipv6_enabled IPv6 でのアクセスを有効化するかを指定する
default_root_object ルートアクセス時に返すデフォルトファイルを指定する(例:index.html
aliases CloudFrontに割り当てる独自ドメイン名を指定する
default_cache_behavior.target_origin_id デフォルトのキャッシュ動作で利用するオリジンを指定する
default_cache_behavior.viewer_protocol_policy HTTPリクエストをHTTPSにリダイレクトするかなど、通信ポリシーを指定する
default_cache_behavior.allowed_methods CloudFrontがオリジンに転送を許可するHTTPメソッドを指定する
default_cache_behavior.cached_methods キャッシュ対象とするHTTPメソッドを指定する
default_cache_behavior.default_ttl キャッシュのデフォルト有効期間(秒)を指定する
default_cache_behavior.max_ttl キャッシュの最大有効期間(秒)を指定する
default_cache_behavior.min_ttl キャッシュの最小有効期間(秒)を指定する
default_cache_behavior.forwarded_values.query_string クエリ文字列をオリジンに転送するかどうかを指定する
default_cache_behavior.forwarded_values.cookies.forward Cookieを転送するかどうかを指定する
default_cache_behavior.function_association.event_type 関連付ける CloudFront Functionを実行するタイミングを指定する(例:viewer-request
default_cache_behavior.function_association.function_arn 関連付ける CloudFront FunctionARNを指定する
viewer_certificate.acm_certificate_arn ACMで発行した証明書のARNを指定する(HTTPS配信用)
viewer_certificate.ssl_support_method SSLのサポート方式を指定する(sni-onlyServer Name Indication を利用して複数の証明書を1つのIPで扱う方式)を使用する)
viewer_certificate.minimum_protocol_version 利用可能な最低TLSバージョンを指定する
restrictions.geo_restriction.restriction_type 配信する地域を制限するかどうかを指定する(noneは制限なし)
custom_error_response.error_code エラーコードを指定する(例:404, 403
custom_error_response.response_code エラー発生時に返す HTTPステータスコードを指定する
custom_error_response.response_page_path エラー時に返すカスタムページのパスを指定する
custom_error_response.error_caching_min_ttl エラー応答をキャッシュする最小時間(秒)を指定する
aws_cloudfront_functionで使用したメソッドと説明
メソッド 説明
name CloudFront Function の名前を指定する
runtime 実行環境を指定する(cloudfront-js-2.0 を使用する)
code 実行するJavaScriptコードのファイルを指定する

用語説明
OAI(Origin Access Identity) の概要

  • CloudFront から S3バケットにアクセスするときだけ使える「特別なユーザー(ID)
  • S3を公開設定にすると、インターネットから誰でもアクセスできてしまう
  • OAIを設定すると、S3バケットを「CloudFront 経由のアクセスだけ許可」できる
  • これにより、ユーザーは必ず CloudFrontを通してコンテンツを取得することになり、直接 S3 にアクセスして不正利用されるのを防げる
rewrite_root.js
function handler(event) {
  var request = event.request;
  var uri = request.uri;

  if (uri.startsWith("/html/") && uri.endsWith(".html")) {
    return request;
  }

  // 存在しないファイルへのリクエストがあった場合、すべて "/html/index.html" を配信する
  request.uri = "/html/index.html";
  return request;
}
variables.tf
# 共通
variable "env" { type = string }
variable "name_prefix" { type = string }
variable "tokyo_region" { type = string }

# ACM 証明書のARN
variable "acm_certificate_virginia_test_com_arn" { type = string}

# S3関連
variable "static_file_delivery_website_domain" { type = string }

# APP サブドメイン名
variable "app_subdomain_name" { type = string }

# ゾーン名
variable "zone_name" { type = string }

locals {
  # prd のときは空、それ以外は ".${var.env}"
  env_suffix = var.env == "prd" ? "" : ".${var.env}"
  app_hostname = "${var.app_subdomain_name}${local.env_suffix}"
}

output.tf
output "cloudfront_static_file_delivery_domain_name" {
  description = "CloudFrontのドメイン名"
  value       = aws_cloudfront_distribution.static_file_delivery.domain_name
}

output "cloudfront_static_file_delivery_hosted_zone_id" {
  description = "CloudFrontのHosted Zone ID(Route53 Alias用)"
  value       = aws_cloudfront_distribution.static_file_delivery.hosted_zone_id
}

output "origin_access_identity_iam_arn" {
  description = "CloudFront のオリジンアクセス用の特別なユーザー(OAI)を識別するための IAM ARN(Amazon リソースネーム)"
  value       = aws_cloudfront_origin_access_identity.oai.iam_arn
}

Route53

route_53.tf
resource "aws_route53_record" "cloudfront_alias" {
  zone_id = var.zone_id
  name    = local.app_hostname
  type    = "A"

  alias {
    name                   = var.cloudfront_static_file_delivery_domain_name
    zone_id                = var.cloudfront_static_file_delivery_hosted_zone_id
    evaluate_target_health = false
  }
}

メソッドと説明

aws_route53_recordで使用したメソッドと説明
メソッド 説明
zone_id レコードを作成する対象の Route53 ホストゾーンを指定する
name 作成するドメイン名を指定する
(ここではアプリのホスト名を設定する)
type レコードの種類を指定する
(ここでは A レコードを作成する)
alias.name 転送先のドメイン名を指定する
CloudFront のドメイン名を設定する)
alias.zone_id 転送先ドメインが存在するホストゾーンID を指定する(CloudFront 専用のホストゾーンID を使う)
alias.evaluate_target_health Route53 がヘルスチェックを利用して転送先の状態を確認するかどうかを指定する
false にしてヘルスチェックを行わない設定にする)

用語説明

  • ホストゾーン(Hosted Zone) : 特定のドメインの DNS 設定をまとめて管理する単位。例:example.com のホストゾーンを作ると、その中にサブドメインやレコードを登録して管理できる
  • ホスト名(Hostname) : ネットワーク上でサーバーやサービスを識別するための名前。例:www.example.comapi.example.com など
    A レコード(Address Record) : DNS レコードの一種で、ドメイン名を IPアドレスに変換するための設定。ユーザーがブラウザでドメインを入力すると、Aレコードを通じて接続先のサーバーがわかる
variables.tf
# 共通
variable "env" { type = string }
variable "name_prefix" { type = string }

# CloudFrontのドメイン名とホストゾーンID
variable "cloudfront_static_file_delivery_domain_name" { type = string }
variable "cloudfront_static_file_delivery_hosted_zone_id" { type = string }

# ゾーンID
variable "zone_id" { type = string }

# APP サブドメイン名
variable "app_subdomain_name" { type = string }

locals {
  # prod のときは空、それ以外は ".${var.env}"
  env_suffix = var.env == "prd" ? "" : ".${var.env}"
  app_hostname = "${var.app_subdomain_name}${local.env_suffix}"
}

GitHub

参考資料

感想

CloudFrontを利用することで、簡単に静的ファイルを高速かつ安全に配信できることを理解しました。S3に保存したファイルを世界中のユーザーに効率的に届けられる仕組みは非常に便利だと感じました。また、ACMを使った証明書管理やRoute53を使ったドメイン設定の役割についても理解が深まり、インフラ構築全体の流れをより具体的に把握することができました。

1
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
1
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?