📔

【入門#10】TerraformでALB/ターゲットグループを作ろう

に公開

今回の目標

Terraformを使って、ALBを作ります。
将来的には下記のシステム構成図になるように進めていきますが、今回はその中のALB/ターゲットグループに絞って解説します。

◯今回のシステム構成図の全体像

関連記事:https://zenn.dev/alt_tanuki/articles/7c1f97da33496b

前提

下記記事で作成したサブネット/セキュリティグループ/EC2を使用していきます。

【入門#4】TerraformでAWS基礎のネットワーク(VPC/サブネット等)を作ろう
【入門#5】Terraformでセキュリティグループを作ろう
【入門#8】TerraformでEC2を作ろう
【入門#9】TerraformでACM証明書を作ろう

ではやっていきましょう!

ALBを書いていきます

よくある例として、ALBはcompute.tfに記載していきます。
compute.tfを書いていきます。

ALB本体

resource "aws_lb" "cask_tokyo_ec2" {
  load_balancer_type = "application"
  name               = "cask-tokyo-ec2"
  internal           = false
  ip_address_type    = "ipv4"

  security_groups = [aws_security_group.cask_tokyo_ec2_sg_alb.id]

  subnets = [
    aws_subnet.cask_tokyo_ec2_subnet_public1.id,
    aws_subnet.cask_tokyo_ec2_subnet_public2.id
  ]

  tags = {
    Name = "tf_test_alb"
  }
}

ターゲットグループ

resource "aws_lb_target_group" "cask_tokyo_ec2_tgtgrp" {
  target_type      = "instance"
  name             = "cask-tokyo-ec2-tgtgrp"
  protocol_version = "HTTP1"
  port             = 80
  protocol         = "HTTP"

  vpc_id = aws_vpc.cask_tokyo_ec2_vpc.id

  tags = {
    Name = "cask-tokyo-ec2-tgtgrp"
  }

  health_check {
    interval            = 30
    path                = "/health"
  }
}

443リスナー

resource "aws_lb_listener" "cask_tokyo_ec2_listener_https" {
  load_balancer_arn = aws_lb.cask_tokyo_ec2.arn
  port              = "443"
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-2016-08"
  certificate_arn   = aws_acm_certificate.cask_tokyo_cert.arn

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

80リスナー (443へリダイレクト)

resource "aws_lb_listener" "cask_tokyo_ec2_listener_http" {
  load_balancer_arn = aws_lb.cask_tokyo_ec2.arn
  port              = "80"
  protocol          = "HTTP"

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

各パラメータ解説

AWSの画面になぞらえて解説します。

ALB: ロードバランサータイプ

今回はALBを指定します。
◯ソース

load_balancer_type = "application"

◯AWSコンソール

ALB: 基本的な設定

◯ソース

# ロードバランサー名
name               = "cask-tokyo-ec2"
# スキーム
internal           = false
# ロードバランサーの IP アドレスタイプ
ip_address_type    = "ipv4"

◯AWSコンソール

ALB: ネットワークマッピング

配置したいサブネットを指定します。
サブネットを指定するだけでOKですが、複数選択しないとエラー発生します。
◯ソース

subnets = [
    aws_subnet.cask_tokyo_ec2_subnet_public1.id,
    aws_subnet.cask_tokyo_ec2_subnet_public2.id
]

◯AWSコンソール

ALB: セキュリティグループ

別途作成したセキュリティグループを設定してきます。
◯ソース

security_groups = [aws_security_group.cask_tokyo_ec2_sg_alb.id]

◯AWSコンソール

ターゲットグループ: ターゲットタイプ

EC2を指定するため、インスタンスを指定します。
◯ソース

target_type = "instance"

◯AWSコンソール

ターゲットグループ: 基本的な設定

EC2を指定するため、インスタンスを指定します。
◯ソース

# ターゲットグループ名
name             = "cask-tokyo-ec2-tgtgrp"
# プロトコル : ポート
protocol         = "HTTP"
port             = 80
# VPC
vpc_id = aws_vpc.cask_tokyo_ec2_vpc.id
# プロトコルバージョン
protocol_version = "HTTP1"

◯AWSコンソール

ターゲットグループ: ヘルスチェック

EC2を指定するため、インスタンスを指定します。
◯ソース

health_check {
  # ヘルスチェックプロトコル
  protocol = "HTTP"
  # ヘルスチェックパス
  path     = "/health"
}

◯AWSコンソール

ターゲットグループ: ヘルスチェック

EC2を指定するため、インスタンスを指定します。
◯ソース

health_check {
  # ヘルスチェックプロトコル
  protocol = "HTTP"
  # ヘルスチェックパス
  path     = "/health"
}

◯AWSコンソール

ALBリスナー(443/HTTPS): リスナーの詳細

リスナーの大枠を設定します。
◯ソース

# 紐づくロードバランサー
load_balancer_arn = aws_lb.cask_tokyo_ec2.arn
# プロトコル/ポート
protocol          = "HTTPS"
port              = "443"

# デフォルトアクション
default_action {
  # ターゲットグループへの転送
  type             = "forward"
  # 転送先のターゲットグループ
  target_group_arn = aws_lb_target_group.cask_tokyo_ec2_tgtgrp.arn
}

◯AWSコンソール

ALBリスナー(443/HTTPS): セキュアなリスナー設定

リスナーのSSL/TLS周りの設定をします。
「【入門#9】TerraformでACM証明書を作ろう」で作成したACMを使用します。
◯ソース

# SSLのポリシー
ssl_policy        = "ELBSecurityPolicy-2016-08"
# ACM証明書のARN
certificate_arn   = aws_acm_certificate.cask_tokyo_cert.arn

◯AWSコンソール

ALBリスナー(80/HTTP): リスナーの詳細

リスナーの大枠を設定します。
◯ソース

# 紐づくロードバランサー
load_balancer_arn = aws_lb.cask_tokyo_ec2.arn
# プロトコル/ポート
protocol          = "HTTP"
port              = "80"

# デフォルトアクション(443へのリダイレクト設定)
default_action {
  type = "redirect"
  redirect {
    port        = "443"
    protocol    = "HTTPS"
    status_code = "HTTP_301"
  }
}

◯AWSコンソール

以上です!

上記設定のうえ、terraform applyを行うと諸々AWSに作成されていることが確認できました!!

ALBはいつも簡単にできるイメージですけど色々設定することが多いですね。。。
いや、、思い出してみると設定値多かったかも。

今回はほとんどデフォルト値を使っているため、もう少し詳細設定されたい場合は
更に設定が必要になりますね。

下記の記事を目次として、続きをどんどん構築を行っていきますので、今回作成したALBの使い方(Route53からの設定)などが気になる方はぜひ見に来てください!

https://zenn.dev/alt_tanuki/articles/7c1f97da33496b

Discussion