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

自前ウェブサイトを構築してみた Part2 - ACM と Route 53 で実現する HTTPS 対応

2
Posted at

はじめに

Part1 では VPC 基盤インフラを構築しました。
Part2 では、ACM(AWS Certificate Manager)と Route 53 を使って HTTPS 対応を実装しました。

対象読者

  • AWS で HTTPS 対応したい方
  • ACM で SSL/TLS 証明書を取得したい方
  • Route 53 でドメイン管理したい方
  • セキュアな Web サイトを構築したい方

概要

Part1 で構築した VPC 基盤に、以下を追加しました:

  1. Route 53 ホストゾーン: ドメイン管理
  2. ACM 証明書: SSL/TLS 証明書(rya234.com)
  3. HTTPS Listener: ALB で HTTPS (443) を受け付け
  4. 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

構成図

image.png

構成要素

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 で管理

手順:

  1. お名前.com でドメイン取得(rya234.com)
  2. Route 53 でホストゾーン作成
  3. お名前.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 検証を自動化:

  1. ACM 証明書リクエスト
  2. DNS 検証レコードを Route 53 に自動作成
  3. 検証完了を待機
  4. 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コマンドで:

  1. Route 53 ホストゾーン作成
  2. ACM 証明書リクエスト
  3. DNS 検証レコード作成
  4. 証明書検証完了待機
  5. ALB HTTPS Listener 作成
  6. HTTP リダイレクト設定

すべてが完了!

2. ACM の素晴らしさ

無料で自動更新される SSL/TLS 証明書は、個人開発者にとって非常にありがたいです。

従来:

  • Let's Encrypt: 3ヶ月ごとに更新が必要
  • 有料証明書: 年間 $50〜$200

ACM:

  • 無料
  • 自動更新
  • AWS との統合が完璧

3. セキュリティの段階的実装

今回は HTTPS 対応だけに集中し、WAF や内部通信の暗号化は次回以降に実装します。

一度に完璧を目指さず、段階的に実装していくのが現実的だと実感しました。

苦労した点

  1. お名前.com のネームサーバー変更

    • Route 53 の NS レコードをコピーして設定
    • 反映に数時間かかった
  2. DNS 検証レコードの理解

    • ACM が発行する CNAME レコードの仕組み
    • Terraform の for_each で動的に作成する方法
  3. 301 vs 302 リダイレクト

    • 恒久的 (301) vs 一時的 (302)
    • SEO への影響を考慮して 301 を選択

参考資料

読んだ本

  1. 入門 Terraform - インフラ時代のインフラ統合管理

  2. AWS コンテナ設計・構築本格入門

AWS ドキュメント


次回予告

Part3: ECS Fargate で Node.js / .NET アプリケーションを動かす

以下を実装予定:

  1. ECS クラスター・タスク・サービスの構築

    • FARGATE_SPOT による 70% コスト削減
    • 最小リソース構成(CPU: 256, Memory: 512MB)
  2. 時間ベース Auto Scaling

    • 22:00 JST: タスク停止
    • 05:00 JST: タスク起動
    • 1 日 17 時間停止で約 70% コスト削減
  3. Secrets Manager 統合

  4. 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 もお楽しみに!

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