🛡️

TerraformでALB+ACMのHTTPS環境を作る

2023/06/05に公開

ALBでHTTPS終端する定番の構成です。
一部Terraform化して試してみました。

こちらのコードにHTTPS用の記述を追加しています。

概要図

Terraform化の対象

  • HTTPSリスナー・リスナールール

Terraform化の対象にしない

これらは手動で作成します。

  • ACM
    • 作成するまでは手動で実施し、Terraformではdataブロックを使い外部参照します。
  • Route53ホストゾーン
  • ALB用Aレコード

環境・前提

  • Terraform 1.4.6
  • ACMで使用するドメインのRoute53ホストゾーン作成済み

流れ

  • ACMで証明書取得
  • HTTPSリスナー追加
  • セキュリティグループ(443)開放
  • Aレコード追加
  • 動作確認

手順

ACMで証明書取得

SSL終端用の証明書をACMで取得します。
今回はALBでの使用のため、バージニア北部(us-east-1)でリクエストする必要はありません。
ALBの存在するリージョンでOKです。

  • 証明書リクエストまで
    • ACMコンソールへ
    • パブリック証明書をリクエスト
    • FQDN(ドメイン名)を入力
    • DNS検証を選択(ホストゾーン設定済みのため)
    • 署名アルゴリズムを選択
  • DNS検証
    • Pending validationステータスの証明書にて「Create record in Route 53」を選択する

  • 〜30分待ってステータスがIssuedとなればOK

ACMで取得したSSL証明書をALBと紐付ける

こちらのページを参考にしながら、Terraformでコードを用意します。
https://repost.aws/ja/knowledge-center/associate-acm-certificate-alb-nlb

ACMのSSL証明書

こちらでTerraformから参照します。
ドメイン名を入れればOKです。

# ACM
data "aws_acm_certificate" "acm" {
  domain   = "example.com"
}

HTTPSリスナー

certificate_arnではdataで指定したSSL証明書、ssl_policyではTLS1.3のセキュリティポリシーを使用します。

# httpsリスナー
resource "aws_lb_listener" "https_listener" {
  load_balancer_arn = aws_lb.test_lb.arn
  port              = 443
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-TLS13-1-2-2021-06"
  certificate_arn   = data.aws_acm_certificate.acm.arn
  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.test_target_group.arn
  }
}

ALBでのTLS1.3は3月下旬に有効になっていました。
https://aws.amazon.com/jp/about-aws/whats-new/2023/03/application-load-balancer-tls-1-3/
https://dev.classmethod.jp/articles/application-load-balancer-tls-1-3/

セキュリティグループ設定

ALBのセキュリティグループの443ポートを忘れずに開けましょう

  ingress {
-    from_port   = 80
-    to_port     = 80
+    from_port   = 443
+    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

ここまででTerraformの準備OKです。
terraform applyし、Aレコードの追加をします。

Aレコード追加

管理しているドメインでALBにアクセス出来るようにAレコードを追加します。

動作確認

このようにHTTPSでアクセスできればOKです。

証明書を見るとこのように署名がAmazonのものとなっており、1年間の期限ということもわかります

参考

https://dev.classmethod.jp/articles/alb-route53-acm-build2/

Discussion