前書き
Web
サイトやアプリケーションを運用する際、静的ファイル(HTML
、CSS
、JavaScript
、画像など)を安全に、そして高速に配信する仕組み は欠かせません。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
コンソールから設定するよりも効率的で、再現性の高いインフラを作れるのが大きなメリットです。
この記事では、S3
+CloudFront
+ACM
+Route53
を組み合わせた静的ファイル配信システムを Terraform
で構築する方法を順を追って解説します。
Amazon CloudFrontの概要
- CDN(コンテンツ配信ネットワーク)サービスであり、低遅延・高速な配信を実現する仕組み
- 世界中のエッジサーバーを経由し、ユーザーに最も近い場所からコンテンツを届けることで読み込み時間を短縮しパフォーマンスを向上させる
- 静的・動的コンテンツや API、動画など幅広いコンテンツを配信できる(HTML・CSS・画像・動画・アプリ・API などに対応)
- 高いセキュリティを備える(HTTPS配信、フィールドレベル暗号化、AWS Shield や AWS WAF による DDoS(分散型サービス拒否攻撃) 対策や攻撃防御を実装可能)
- CloudFront Functions や Lambda@Edge によるエッジ処理が可能(JavaScript コードをユーザーに近い場所で実行し、リクエスト振り分けやヘッダー操作を実現)
前提条件
- Terraformhを動作させる環境が存在する
- AWSの認証は、AWS-Vaultの設定方法を参考に設定している
- Route53にて、ドメインの作成が完了している
構築内容
ディレクトリー構成
.
├── 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内の設定ファイル
# 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
}
# 現在の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
では使えない
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
)に変換する仕組み。インターネットの「住所録」のような役割を持つ
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 "acm_certificate_virginia_test_com_arn" {
value = aws_acm_certificate.virginia_test_com.arn
}
S3
# 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-S3 の AES256 を利用する) |
data "aws_iam_policy_document"(allow_cloudfront)で使用したメソッドと説明
メソッド | 説明 |
---|---|
statement.effect | ポリシーの効果を指定する(Allow で許可を与える) |
statement.principals.type | プリンシパルの種類を指定する(AWS を指定して IAM エンティティを対象にする) |
statement.principals.identifiers | 許可対象の IAM エンティティを指定する(CloudFront OAI の IAM ARN を指定する) |
statement.actions | 許可するアクションを指定する(S3 オブジェクトの取得 s3:GetObject を許可する) |
statement.resources | ポリシーの適用対象リソースを指定する(対象バケット配下の全オブジェクトを指定する) |
用語説明
- プリンシパル(Principal) : 「この操作をする人やサービスは誰か」を示すもの
-
IAM エンティティ(IAM Entity) :
AWS IAM(AWS Identity and Access Management)
で管理される認証対象を示す。ユーザー(人)やロール(権限を持つ役割)などを指す - `S3 オブジェクト(S3 Object)** : S3 バケットの中に保存されるファイルやデータ。実体はファイル本体とメタデータ(属性情報)で構成される
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 "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
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 Function のARN を指定する |
viewer_certificate.acm_certificate_arn |
ACM で発行した証明書のARN を指定する(HTTPS 配信用) |
viewer_certificate.ssl_support_method |
SSL のサポート方式を指定する(sni-only (Server 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 にアクセスして不正利用されるのを防げる
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;
}
# 共通
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 "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
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.com
やapi.example.com
など
A レコード(Address Record) :DNS
レコードの一種で、ドメイン名をIP
アドレスに変換するための設定。ユーザーがブラウザでドメインを入力すると、A
レコードを通じて接続先のサーバーがわかる
# 共通
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
を使ったドメイン設定の役割についても理解が深まり、インフラ構築全体の流れをより具体的に把握することができました。