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?

AWS 無料チュートリアルその9: 外部ドメインを使って AWS を HTTPS 化する

0
Posted at

AWSの無料枠で出来る範囲のチュートリアルを ChatGPT に示して頂いたので、試してみた経過を簡単にまとめてみました。
AWS等の実際の画面や操作はどんな感じか知りたい方を読者対象としているつもりです。

著者はAWS クラウドプラクティショナー、ソリューションアーキテクト アソシエイト という資格を取得済みで「AWSってなんぞや?」という概要を知識としてある程度理解しているが、実際にAWSの画面を触ったことが無いという状態でAWSのチュートリアルをこなしていくという状況です。

今回の内容としては、外部ドメイン × AWS HTTPS化 を目標にしたいと思います。

全体像(今回やること)

お名前.com(ドメイン管理)
        ↓(NS設定)
Route53(DNS管理)
        ↓
ALB(HTTPS)
        ↓
EC2(nginx)

⚠️ 前提(必須)

HTTPSには👇が必要です

ドメイン(example.com)

なぜ?

ACMはIPアドレスに証明書を発行できない

🎯 構成要素

追加するもの👇

・ACM証明書
・HTTPSリスナー(443)
・HTTP→HTTPSリダイレクト

前回(AWS 無料チュートリアルその8)のmain.tfに以下のコードを追記します。

main.tf
############################################
# ACM証明書
############################################

resource "aws_acm_certificate" "cert" {
  domain_name       = "あなたのドメイン名"
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }
}


############################################
# DNS検証(Route53)
############################################

resource "aws_route53_record" "cert_validation" {
  for_each = {
    for dvo in aws_acm_certificate.cert.domain_validation_options :
    dvo.domain_name => dvo
  }

  zone_id = "あなたのZONE_ID"

  name    = each.value.resource_record_name
  type    = each.value.resource_record_type
  records = [each.value.resource_record_value]

  ttl = 60
}

############################################
# 証明書の検証完了
############################################

resource "aws_acm_certificate_validation" "cert_validation" {
  certificate_arn         = aws_acm_certificate.cert.arn
  validation_record_fqdns = [
    for record in aws_route53_record.cert_validation : record.fqdn
  ]
}

############################################
# HTTPSリスナー(443)
############################################

resource "aws_lb_listener" "https" {
  load_balancer_arn = aws_lb.alb.arn
  port              = 443
  protocol          = "HTTPS"

  ssl_policy        = "ELBSecurityPolicy-2016-08"
  certificate_arn   = aws_acm_certificate.cert.arn

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.tg.arn
  }

  depends_on = [aws_acm_certificate_validation.cert_validation]
}

############################################
# HTTP → HTTPSリダイレクト
############################################

resource "aws_lb_listener" "http_redirect" {
  load_balancer_arn = aws_lb.alb.arn
  port              = 80
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

############################################
# Route53(ALBに向ける)
############################################

resource "aws_route53_record" "alb_record" {
  zone_id = "あなたのZONE_ID"
  name    = "あなたのドメイン名"
  type    = "A"

  alias {
    name                   = aws_lb.alb.dns_name
    zone_id                = aws_lb.alb.zone_id
    evaluate_target_health = true
  }
}

⚠️ 重要ポイント

ドメインは「お名前.com」
DNSは「Route53」に移管する

🧩 手順① Route53でホストゾーン作成

AWSコンソール → Route53 → 「ホストゾーン作成」

image.png

入力

ドメイン名:net-4.net (私の場合)
タイプ:パブリックホストゾーン

image.png

作成後に出る以下のものを控えておく

ns-123.awsdns-xx.com
ns-456.awsdns-xx.net
ns-789.awsdns-xx.org
ns-000.awsdns-xx.co.uk

🧩 手順② お名前.comでネームサーバ変更

お名前.com側

👉 ネームサーバ設定変更

設定内容

Route53で出たNSを4つそのまま貼る

image.png

👉 これで

DNS管理がRoute53に移る

⏳ 注意

反映に数分〜数時間かかる

🧩 手順③ ACM証明書

Terraform

main.tf
resource "aws_acm_certificate" "cert" {
  domain_name       = "あなたが取得したドメイン名"
  validation_method = "DNS"
}

実行

terraform apply

👉 すると👇

DNS検証用レコードが出る

🧩 手順④ DNS検証レコード追加

main.tf
resource "aws_route53_record" "cert_validation" {
  for_each = {
    for dvo in aws_acm_certificate.cert.domain_validation_options :
    dvo.domain_name => dvo
  }

  zone_id = "Route53のHostedZoneIDを入力"

  name    = each.value.resource_record_name
  type    = each.value.resource_record_type
  records = [each.value.resource_record_value]

  ttl = 60
}

image.png

👉 これで

自動で検証完了

🧩 手順⑤ ALBにHTTPS追加

main.tf
resource "aws_lb_listener" "https" {
  load_balancer_arn = aws_lb.alb.arn
  port              = 443
  protocol          = "HTTPS"

  certificate_arn = aws_acm_certificate.cert.arn

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.tg.arn
  }
}

🧩 手順⑥ ドメイン → ALB紐付け

main.tf
resource "aws_route53_record" "alb_record" {
  zone_id = "Route53のHostedZoneID"
  name    = "net-4.net"
  type    = "A"

  alias {
    name                   = aws_lb.alb.dns_name
    zone_id                = aws_lb.alb.zone_id
    evaluate_target_health = true
  }
}

🔥 よくあるハマりポイント

❌ HTTPSできない

👉 原因

NS設定ミス
ACM未検証

❌ 反映されない

👉 原因

DNS伝播待ち

❌ ALB DNSは見れるのにドメインNG

👉 原因

Route53レコード未設定

💡 確認方法

nslookup 取得したドメイン名

👉 ALBのDNSが出ればOK

ハマりポイント

Hosted Zone が一つではない

image.png

やるべきこと

3つのHosted Zone全部確認
👉 Route53 → ホストゾーン一覧


それぞれ開いて確認

NSレコードの値

正解のゾーンを特定
あなたのnslookup

ns-123.awsdns-xx.com
ns-456.awsdns-xx.net
ns-789.awsdns-xx.org
ns-000.awsdns-xx.co.uk

👉 この4つと完全一致するゾーンが「本物」

🎯 次にやること

✅ そのゾーンの中を見る


❗ チェックポイント

Aレコード → 何を指してる?

パターン①(正しい)

ALBのDNS

パターン②(原因)

13.158.xxx とかのIP

→ これなら確定で原因

🔧 解決方法

方法①(おすすめ)

👉 正しいゾーンにAレコードを作る


方法②(シンプル)

👉 他の2つのゾーン削除


💡 一番ラクな方法

正しいNSのゾーン以外、全部削除

🚨 注意

削除する前に👇

NSが一致してるゾーンだけ残す

ハマりポイントその2

$ curl -I http://secure-alb-1783625199.ap-northeast-1.elb.amazonaws.com
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0   134    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0HTTP/1.1 301 Moved Permanently
Server: awselb/2.0
Date: Fri, 10 Apr 2026 04:26:09 GMT
Content-Type: text/html
Content-Length: 134
Connection: keep-alive
Location: https://secure-alb-1783625199.ap-northeast-1.elb.amazonaws.com:443/

🎯 推論

ALBは正常(HTTP→HTTPSリダイレクトもOK)
しかし HTTPS(443) が外部から到達できていない

🔍 curlコマンドの意味

HTTP/1.1 301 Moved Permanently
Location: https://secure-alb-xxx:443/

👉 これは

HTTP(80) → HTTPS(443)へリダイレクト成功

👉 つまり

ALBは生きている
リスナーも動いている

❗ なのにタイムアウトする理由

👉 リダイレクト先👇

https://net-4.net(443番ポート)

👉 ここが

外からアクセスできない

🧨 可能性の高い原因

ALBのセキュリティグループで 443 が開いていない

🔧 Terraform修正例

もしalb_sgがこうなら👇

main.tf
resource "aws_security_group" "alb_sg" {
  ingress {
    from_port = 80
    to_port   = 80

👉 これ追加👇(以前のコードに追記しました)

main.tf
  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

🎯 成功するとこうなる

nslookup あなたのドメイン名

👇

secure-alb-xxxx.elb.amazonaws.com

🎉 その後

https://あなたのドメイン名

👉 🔒 nginx表示

image.png

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?