【Terraform】AWS ALB with SSLでホストベースルーティングする

さて、今日はTerraformでALB with SSL証明書をやりませう

バージョン情報は以下の通り

$ terraform version
Terraform v0.13.1
+ provider registry.terraform.io/hashicorp/aws v3.7.0
+ provider registry.terraform.io/hashicorp/random v2.3.0

それでは、本題に入ります。
ALBのリソース構成要素は以下です。

  • aws_lb
  • aws_lb_listener
  • aws_lb_listener_certificate
  • aws_lb_listener_rule
  • aws_lb_target_group
  • aws_lb_target_group_attachment

多いっすけど、ざっくり3つです。
ALB本体とリスナーとターゲットグループ(フォワードするEC2)です。

以下がalb関連のtfファイルです。やっていることは、testっていうlistenerを作って443でリッスンして、devっていうtarget_groupに8080ポートでdev.ドメイン名にフォワードしています。SSL証明書はaws_lb_listenerとaws_lb_listener_certificateで定義しています。certificate定義は別のtfファイルに書いていますので、後述。

resource "aws_lb" "test" {
  name               = "test-lb"
  internal           = false
  load_balancer_type = "application"
  subnets            = [aws_subnet.public1.id, aws_subnet.public2.id]
  security_groups    = [aws_security_group.alb.id]

  enable_deletion_protection = false

  tags = {
    Name        = "test-lb"
    Environment = "development"
    Description = "Managed by Terraform"
  }
}

resource "aws_lb_listener" "test" {
  load_balancer_arn = aws_lb.test.arn
  port              = "443"
  protocol          = "HTTPS"
  certificate_arn   = aws_acm_certificate.test.arn

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

resource "aws_lb_listener_certificate" "test" {
  listener_arn    = aws_lb_listener.test.arn
  certificate_arn = aws_acm_certificate.test.arn
}

resource "aws_lb_listener_rule" "test" {
  listener_arn = aws_lb_listener.test.arn
  priority     = 100

  action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.dev.arn
  }

  condition {
    host_header {
      values = ["dev.ドメイン名"]
    }
  }
}

resource "random_integer" "default" {
  min = 1
  max = 9999
}
resource "aws_lb_target_group" "dev" {
  name        = "dev-${random_integer.default.result}"
  port        = 8080
  protocol    = "HTTP"
  target_type = "instance"
  vpc_id      = aws_vpc.main.id
  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_lb_target_group_attachment" "dev" {
  target_group_arn = aws_lb_target_group.dev.arn
  target_id        = aws_instance.main.id
  port             = 8080
}

certificateは以下のtfファイルです。
バリデーション方法はDNSにしています。

resource "aws_acm_certificate" "test" {
  domain_name       = "dev.ドメイン名"
  validation_method = "DNS"


  tags = {
    Environment = "development"
  }


  lifecycle {
    create_before_destroy = true
  }
}

VPCなどのネットワーク周りやセキュリティグループは割愛しますが、
ここまでできたら、terraform validateしてfmtしてapplyでOK

無事applyできたら、certificateのDNS認証をします。
こちらは、AWSコンソールでACMからレコード情報をダウンロードし、Route53でCNAMEレコードを追加します。
その後、Route53でdev.ドメイン名をAレコードでALBのDNS名で登録すればOKです。

そしたら、Webサーバー側のserver nameをdev.ドメイン名にしてあげて、reloadすれば無事にホストベースのルーティングができます。

めでたしめでたし

実践Terraform AWSにおけるシステム設計とベストプラクティス (技術の泉シリーズ(NextPublishing))

Please share this page:

コメントを残す