皆様こんにちは。
Terraformを利用して、AWSで高可用性アーキテクトの構築をしていきます。
今回はALBを構築していきます。

1.高可用性アーキテクト構築目次

目次はこちら

2.ELBの概要

ELB (Elastic Load Balancing) は、アプリケーションへのトラフィックを、1 つまたは複数のアベイラビリティーゾーン (AZ) 内の複数のターゲットおよび仮想アプライアンスに自動的に分散します。

Elastic Load Balancing

ELBには下記の3種類のロードバランサーがあります。

  • ALB
  • NLB
  • CLB

CLBとALBは同じアプリケーションでの負荷分散を行いますが、後継サービスであるALBの方が安価で機能も豊富です。具体的な機能としては、WebSocketやHTTP/2に対応していること、URLパターンによって振り分け先を変えるパスベースルーティング機能が提供されていることが挙げられます。
NLBはHTTP、HTTPS以外のTCPプロトコルの分散に用いられます。ロードバランサー自体が固定のIPアドレスを持つなどの特徴があります。
また、IPアドレスを保持したままリクエストの振り分けを行いたい場合はNLBを利用します。詳細は下記の記事を参照してください。
ALBとNLBの違いまとめ

3.フロー図

下記は今回作成するALBのフロー図です。

障害が発生した場合に備えてマルチAZ配置で冗長化し、ALBを利用することで単一障害点を避け、負荷分散します。

下記の手順でALBを構築します。

  1. ALBの作成
  2. ターゲットグループを作成して、EC2インスタンスにアタッチ
  3. リスナーを設定(Wordpress上でhttps設定を完了するまではHTTPリスナーを一時的に設定)

4.ALBの構築

ALBを構築していきます。
全体のソースコードは下記の通りです。

#----------------------------------------
# ALBの構築
#----------------------------------------
//ALB
resource "aws_lb" "higa-ALB" {
  name               = "higa-ALB"
  internal           = false
  load_balancer_type = "application"
  //アプリケーションタイプのロードバランサーに対してのみ有効
  security_groups = [aws_security_group.higa-ALB-sg.id]
  subnets = [aws_subnet.higa-Public-subnet-1a.id,
  aws_subnet.higa-Public-subnet-2c.id]
  ip_address_type = "ipv4"

  tags = {
    name = "higa-ALB"
  }
}

// ターゲットグループ
resource "aws_lb_target_group" "higa-TGN" {
  name             = "higa-TGN"
  target_type      = "instance"
  protocol_version = "HTTP1"
  port             = 80
  protocol         = "HTTP"
  vpc_id           = aws_vpc.higa-vpc.id

  tags = {
    name = "higa-TGN"
  }

  health_check {
    interval            = 30
    path                = "/"
    port                = "traffic-port"
    protocol            = "HTTP"
    timeout             = 5
    healthy_threshold   = 5
    unhealthy_threshold = 2
    matcher             = "200,301"
  }
}

// ターゲットグループにEC2インスタンスを登録
//1台目のEC2インスタンスに登録
resource "aws_lb_target_group_attachment" "higa-target_ec2-1" {
  target_group_arn = aws_lb_target_group.higa-TGN.arn
  target_id        = aws_instance.higa-ec2-1.id
}
//2台目のEC2インスタンスに登録
resource "aws_lb_target_group_attachment" "higa-target_ec2-2" {
  target_group_arn = aws_lb_target_group.higa-TGN.arn
  target_id        = aws_instance.higa-ec2-2.id
}

// リスナー設定
resource "aws_lb_listener" "higa-listener" {
  load_balancer_arn = aws_lb.higa-ALB.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.higa-TGN.arn
  }
}

4-1.ALBの設定

ALBの設定をしていきます。
ソースコードは下記の通りです。(4~18行目)

//ALB
resource "aws_lb" "higa-ALB" {
  name               = "higa-ALB"
  internal           = false
  load_balancer_type = "application"
  //アプリケーションタイプのロードバランサーに対してのみ有効
  security_groups = [aws_security_group.higa-ALB-sg.id]
  subnets = [aws_subnet.higa-Public-subnet-1a.id,
  aws_subnet.higa-Public-subnet-2c.id]
  ip_address_type = "ipv4"

  tags = {
    name = "higa-ALB"
  }
}

設定項目は下記の通りです。

使用するオプション 設定値 説明
name higa-ALB ALBの名前を設定
internal false 外部に公開するため
load_balancer_type application ロードバランサの種類はALBを指定
security_groups aws_security_group.higa-ALB-sg.id ALB用に作成したSGを指定
subnets aws_subnet.higa-Public-subnet-1a.id
aws_subnet.higa-Public-subnet-2c.id
作成した2つのパブリックサブネットを指定
ip_address_type ipv4 ipv6を使用しないためipv4のみ指定
tags name = "higa-ALB" タグを設定

これでALBの設定ができました。

4-2.ターゲットグループの作成

ターゲットグループとはリクエストの振り分け先となる対象のことで、それらをグループ化したものがターゲットグループです。
ターゲットグループを設定することでターゲットの状態監視が可能になり、耐障害性が高まります。

ソースコードは下記の通りです。(20~43行目)

// ターゲットグループ
resource "aws_lb_target_group" "higa-TGN" {
  name             = "higa-TGN"
  target_type      = "instance"
  protocol_version = "HTTP1"
  port             = 80
  protocol         = "HTTP"
  vpc_id           = aws_vpc.higa-vpc.id

  tags = {
    name = "higa-TGN"
  }

  health_check {
    interval            = 30
    path                = "/"
    port                = "traffic-port"
    protocol            = "HTTP"
    timeout             = 5
    healthy_threshold   = 5
    unhealthy_threshold = 2
    matcher             = "200,301"
  }
}

設定項目は下記の通りです。

使用するオプション 設定値 説明
name higa-TGN TGNの名前を設定
target_type instance 作成したEC2にALBを設定したいため、instanceを設定
protocol_version HTTP1 プロトコルバージョンの設定。デフォルトはHTTP1
port 80 ポートを指定
protocol HTTP プロトコルを指定
vpc_id aws_vpc.higa-vpc.id 作成したvpcを指定
tags name = "higa-TGN" タグを設定
health_check 下記の表に記載 ヘルスチェック構成ブロック

ヘルスチェックの設定は下記の通りです。

使用するオプション 設定値 説明
interval 30 間隔
path / 要件がないためデフォルト
port traffic-port 要件がないためデフォルト
protocol HTTP プロトコルの設定
timeout 5 タイムアウト
healthy_threshold 5 正常のしきい値
unhealthy_threshold 2 非正常のしきい値
matcher 200,300 成功コード

ターゲットグループの作成ができました。

4-3.ターゲットグループにEC2インスタンスを登録

インスタンスをALBに登録していきます。
ソースコードは下記の通りです。(45~55行目)

// ターゲットグループにEC2インスタンスを登録
//1台目のEC2インスタンスに登録
resource "aws_lb_target_group_attachment" "higa-target_ec2-1" {
  target_group_arn = aws_lb_target_group.higa-TGN.arn
  target_id        = aws_instance.higa-ec2-1.id
}
//2台目のEC2インスタンスに登録
resource "aws_lb_target_group_attachment" "higa-target_ec2-2" {
  target_group_arn = aws_lb_target_group.higa-TGN.arn
  target_id        = aws_instance.higa-ec2-2.id
}

設定項目は下記の通りです。

使用するオプション 設定値 説明
target_group_arn aws_lb_target_group.higa-TGN.arn TGNのARNを指定
target_id aws_instance.higa-ec2-1.id
aws_instance.higa-ec2-2.id
作成した2つのEC2インスタンスを指定

ターゲットの登録ができました。

4-4.リスナー設定

リスナーとは、接続リクエストをチェックするプロセスです。クライアント(ユーザーやインスタンス)からどのようなプロトコルでアクセスを受け付けるかを定義し、ターゲットグループへ通信を負荷分散します。

リスナーの設定をしていきます。
ソースコードは下記の通りです。(57~67行目)

// リスナー設定
resource "aws_lb_listener" "higa-listener" {
  load_balancer_arn = aws_lb.higa-ALB.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.higa-TGN.arn
  }
}

設定項目は下記の通りです。

使用するオプション 設定値 説明
load_balancer_arn aws_lb.higa-ALB.arn ALBのARNを指定
port 80 ポートを設定
protocol HTTP プロトコルを設定
default_action type = "forward"
target_group_arn = aws_lb_target_group.higa-TGN.arn
TGNのARNを指定

上記の検証より、成功の確認ができました。

5.検証

PowershellのTest-NetConnectionコマンドを利用してALBの通信確認を行います。

Test-NetConnection [ALB DNS名] -port 80

PS C:\Users\higak> Test-NetConnection higa-ALB-985017257.ap-southeast-1.elb.amazonaws.com -port 80

ComputerName     : higa-ALB-985017257.ap-southeast-1.elb.amazonaws.com
RemoteAddress    : 52.76.15.40
RemotePort       : 80
InterfaceAlias   : Wi-Fi
SourceAddress    : 192.168.0.8
TcpTestSucceeded : True

6.まとめ

何度かエラーが発生しましたが、エラー文を読み、Terraformの公式ドキュメントを参考にすることでスムーズに解決できました。
ALBは単一障害点をさけるために利用し、負荷分散できるということは知っていましたが、ALBを構築することでターゲットグループ、リスナー設定といった概念も理解することができました。

7.参考文献

Last modified: 2022-06-24

Author