はじめに
Part1 では VPC 基盤インフラを構築しました。
Part2 では、ACM(AWS Certificate Manager)と Route 53 を使って HTTPS 対応を実装しました。
対象読者
- AWS で HTTPS 対応したい方
- ACM で SSL/TLS 証明書を取得したい方
- Route 53 でドメイン管理したい方
- セキュアな Web サイトを構築したい方
概要
Part1 で構築した VPC 基盤に、以下を追加しました:
- Route 53 ホストゾーン: ドメイン管理
- ACM 証明書: SSL/TLS 証明書(rya234.com)
- HTTPS Listener: ALB で HTTPS (443) を受け付け
- HTTP → HTTPS リダイレクト: HTTP アクセスを HTTPS へ自動転送
開発環境
ローカル環境
| 項目 | バージョン/内容 |
|---|---|
| OS | Windows 11 |
| Terraform | v1.6.0 以上 |
| AWS CLI | v2.13.0 以上 |
| エディタ | VSCode + Terraform 拡張機能 |
| Git | バージョン管理 |
AWS 環境
| 項目 | 内容 |
|---|---|
| リージョン | ap-northeast-1(東京) |
| アカウント | 個人アカウント |
ドメイン
| 項目 | 内容 |
|---|---|
| ドメイン名 | rya234.com |
| レジストラ | お名前.com |
| ネームサーバー | Route 53 |
構成図
構成要素
Part1 から変更なし:
- VPC: 10.0.0.0/16
- Internet Gateway
- Public Subnet (1a): 10.0.1.0/24
- Private Subnet (1a): 10.0.2.0/24
- Private Subnet (1c): 10.0.3.0/24
- VPC Endpoints(ECR API/DKR, S3, CloudWatch Logs)
Part2 で追加:
- Route 53 ホストゾーン: rya234.com
- ACM 証明書: rya234.com + www.rya234.com(DNS 検証)
- ALB HTTPS Listener: Port 443(TLS 1.3)
- ALB HTTP Listener 変更: Port 80 → HTTPS へリダイレクト(301)
- Security Group 更新: ALB に 443 ポート許可
今回実現したこと
1. Route 53 でドメイン管理
お名前.com で取得したドメインを Route 53 で管理
手順:
- お名前.com でドメイン取得(rya234.com)
- Route 53 でホストゾーン作成
- お名前.com のネームサーバーを Route 53 の NS レコードに変更
# Route53 Hosted Zone
resource "aws_route53_zone" "main" {
name = "rya234.com"
tags = {
Name = "rya234.com-hosted-zone"
}
}
# A Record pointing to ALB
resource "aws_route53_record" "alb" {
zone_id = aws_route53_zone.main.zone_id
name = "rya234.com"
type = "A"
alias {
name = aws_lb.main.dns_name
zone_id = aws_lb.main.zone_id
evaluate_target_health = true
}
}
# www subdomain
resource "aws_route53_record" "www" {
zone_id = aws_route53_zone.main.zone_id
name = "www.rya234.com"
type = "A"
alias {
name = aws_lb.main.dns_name
zone_id = aws_lb.main.zone_id
evaluate_target_health = true
}
}
ポイント:
- Alias レコードを使用して ALB に直接ルーティング(追加料金なし)
- www サブドメインも同時にサポート
2. ACM で無料 SSL/TLS 証明書取得
DNS 検証で証明書を自動取得
# ACM Certificate for rya234.com
resource "aws_acm_certificate" "main" {
domain_name = "rya234.com"
validation_method = "DNS"
subject_alternative_names = [
"www.rya234.com"
]
lifecycle {
create_before_destroy = true
}
tags = {
Name = "rya234.com-certificate"
}
}
# DNS validation records
resource "aws_route53_record" "cert_validation" {
for_each = {
for dvo in aws_acm_certificate.main.domain_validation_options : dvo.domain_name => {
name = dvo.resource_record_name
record = dvo.resource_record_value
type = dvo.resource_record_type
}
}
allow_overwrite = true
name = each.value.name
records = [each.value.record]
ttl = 60
type = each.value.type
zone_id = aws_route53_zone.main.zone_id
}
# Wait for validation
resource "aws_acm_certificate_validation" "main" {
certificate_arn = aws_acm_certificate.main.arn
validation_record_fqdns = [for record in aws_route53_record.cert_validation : record.fqdn]
}
メリット:
- 無料: ACM 証明書は AWS リソース利用時無料
- 自動更新: 有効期限前に自動更新
- DNS 検証: メール検証不要、自動化可能
3. ALB で HTTPS Listener 追加
TLS 1.3 対応の HTTPS リスナー
# HTTPS Listener
resource "aws_lb_listener" "https" {
load_balancer_arn = aws_lb.main.arn
port = "443"
protocol = "HTTPS"
ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06"
certificate_arn = aws_acm_certificate_validation.main.certificate_arn
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.app.arn
}
}
ポイント:
- TLS 1.3: 最新のセキュリティポリシー
-
ELBSecurityPolicy-TLS13-1-2-2021-06を使用
4. HTTP → HTTPS リダイレクト
HTTP アクセスを自動的に HTTPS へ転送
# HTTP Listener (Redirect to HTTPS)
resource "aws_lb_listener" "http" {
load_balancer_arn = aws_lb.main.arn
port = "80"
protocol = "HTTP"
default_action {
type = "redirect"
redirect {
port = "443"
protocol = "HTTPS"
status_code = "HTTP_301"
}
}
}
仕組み:
http://rya234.com → 301 リダイレクト → https://rya234.com
ステータスコード:
- 301 Moved Permanently: 恒久的なリダイレクト
- ブラウザがキャッシュして次回から直接 HTTPS アクセス
5. Security Group 更新
HTTPS トラフィック(443)を許可
resource "aws_security_group" "alb" {
name = "alb-sg"
vpc_id = aws_vpc.main.id
# HTTP(リダイレクト用)
ingress {
description = "HTTP from Internet"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
# HTTPS
ingress {
description = "HTTPS from Internet"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
技術的なポイント
ポイント1: DNS 検証による自動化
メール検証との比較:
| 方式 | DNS 検証 | メール検証 |
|---|---|---|
| 自動化 | ✅ 可能 | ❌ 手動 |
| Terraform | ✅ 完全自動 | ❌ 手動介入必要 |
| 更新 | ✅ 自動 | ❌ 手動確認 |
| スピード | 数分 | 数時間〜1日 |
Terraform で DNS 検証を自動化:
- ACM 証明書リクエスト
- DNS 検証レコードを Route 53 に自動作成
- 検証完了を待機
- ALB Listener に証明書を設定
すべて terraform apply 1回で完了!
ポイント2: TLS 1.3 対応
セキュリティポリシーの選択:
| ポリシー | TLS バージョン | 用途 |
|---|---|---|
| ELBSecurityPolicy-TLS13-1-2-2021-06 | TLS 1.3, 1.2 | 最新・推奨 |
| ELBSecurityPolicy-2016-08 | TLS 1.2, 1.1, 1.0 | 古いブラウザ対応 |
TLS 1.3 のメリット:
- より高速な接続確立(1-RTT)
- より強固な暗号化
- 脆弱な暗号スイートを排除
ポイント3: Alias レコードでコスト削減
A レコード vs Alias レコード:
| タイプ | 料金 | ALB 対応 |
|---|---|---|
| Alias | 無料 | ✅ ネイティブ対応 |
| CNAME | 有料 | ✅ 可能 |
| A | 有料 | ❌ IP 固定が必要 |
Alias レコードを使う理由:
- Route 53 クエリが無料
- ALB の IP 変更に自動追従
- Zone Apex(rya234.com)で使用可能
コスト試算
Part2 追加コスト(月額)
| サービス | 詳細 | 月額 |
|---|---|---|
| Route 53 ホストゾーン | 1 ゾーン | $0.50 |
| Route 53 クエリ | 少量(個人利用) | 〜$0.10 |
| ACM 証明書 | AWS リソース利用時無料 | $0 |
| 追加分合計 | 約 $0.60/月 |
全体コスト(Part1 + Part2)
| サービス | 詳細 | 月額 |
|---|---|---|
| VPC | 無料 | $0 |
| Internet Gateway | 無料 | $0 |
| ALB | 時間料金 + LCU | 約 $20 |
| VPC Endpoint (Interface型) | $7.30 × 3 | $21.90 |
| VPC Endpoint (Gateway型) | S3 は無料 | $0 |
| Route 53 | ホストゾーン + クエリ | $0.60 |
| ACM | 無料 | $0 |
| 合計 | 約 $42.50/月 |
ドメイン費用(年額):
- お名前.com: 約 ¥1,500/年 = 約 $10/年 = $0.83/月
総額: 約 $43.33/月(ECS タスク起動前)
感想
学んだこと
1. Terraform による完全自動化の威力
ACM 証明書の DNS 検証を含め、すべてを Terraform で自動化できました。
terraform plan
terraform apply
たった2コマンドで:
- Route 53 ホストゾーン作成
- ACM 証明書リクエスト
- DNS 検証レコード作成
- 証明書検証完了待機
- ALB HTTPS Listener 作成
- HTTP リダイレクト設定
すべてが完了!
2. ACM の素晴らしさ
無料で自動更新される SSL/TLS 証明書は、個人開発者にとって非常にありがたいです。
従来:
- Let's Encrypt: 3ヶ月ごとに更新が必要
- 有料証明書: 年間 $50〜$200
ACM:
- 無料
- 自動更新
- AWS との統合が完璧
3. セキュリティの段階的実装
今回は HTTPS 対応だけに集中し、WAF や内部通信の暗号化は次回以降に実装します。
一度に完璧を目指さず、段階的に実装していくのが現実的だと実感しました。
苦労した点
-
お名前.com のネームサーバー変更
- Route 53 の NS レコードをコピーして設定
- 反映に数時間かかった
-
DNS 検証レコードの理解
- ACM が発行する CNAME レコードの仕組み
- Terraform の
for_eachで動的に作成する方法
-
301 vs 302 リダイレクト
- 恒久的 (301) vs 一時的 (302)
- SEO への影響を考慮して 301 を選択
参考資料
読んだ本
AWS ドキュメント
次回予告
Part3: ECS Fargate で Node.js / .NET アプリケーションを動かす
以下を実装予定:
-
ECS クラスター・タスク・サービスの構築
- FARGATE_SPOT による 70% コスト削減
- 最小リソース構成(CPU: 256, Memory: 512MB)
-
時間ベース Auto Scaling
- 22:00 JST: タスク停止
- 05:00 JST: タスク起動
- 1 日 17 時間停止で約 70% コスト削減
-
Secrets Manager 統合
-
CloudWatch Logs 設定
お楽しみに!
まとめ
この記事で実現したこと
- ✅ Route 53 でドメイン管理(rya234.com)
- ✅ ACM で無料 SSL/TLS 証明書取得(自動更新)
- ✅ HTTPS Listener 追加(TLS 1.3)
- ✅ HTTP → HTTPS 自動リダイレクト(301)
- ✅ Security Group 更新(443 許可)
- ✅ Terraform による完全自動化
次のステップ
- 🔧 ECS クラスター・タスク・サービスの作成
- 🔧 WAF 導入
- 🔧 Secrets Manager 統合
- 🔧 監視・アラート設定
GitHubリポジトリ
最後まで読んでいただき、ありがとうございました!
次回 Part3 もお楽しみに!
