この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
皆様こんにちは。
Terraformを利用して、AWSで高可用性アーキテクトの構築をしていきます。
今回はALBを構築していきます。
1.高可用性アーキテクト構築目次
2.ELBの概要
ELB (Elastic Load Balancing) は、アプリケーションへのトラフィックを、1 つまたは複数のアベイラビリティーゾーン (AZ) 内の複数のターゲットおよび仮想アプライアンスに自動的に分散します。
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を構築します。
- ALBの作成
- ターゲットグループを作成して、EC2インスタンスにアタッチ
- リスナーを設定(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.参考文献
- terraformの公式ドキュメント
Docs overview | hashicorp/aws | Terraform Registry