概要
Terraformで以下の構成図のようにALBからNLBへ連携する際にハマりました。
当記事にて解決策を記載します。
ハマったところ
バックエンドのWebアプリとNLB設置完了後、ALBのターゲットグループリソース(aws_lb_target_group)でNLBへ連携しようとしました。
が・・・Terraform公式ドキュメントを参照するとtarget_type引数に”nlb”が存在しません!
target_type引数でサポートされている値は”instance”、”ip”、”lambda”そして”alb”のみです。
※試しに「target_type =”alb”」でterraform planしてみましたがエラーが発生しました。
Terraform Registry
解決策
NLBへ静的IPをセットして、ALBのターゲットグループからは「target_type =”ip”」で連携します。
1.NLBへ静的IPをセット
- 以下のようにsubnet_mapping引数を使用して、配置先のサブネットとそのIPアドレス範囲内のプライベートIPアドレスを指定します。
# NLB IPs
variable "target_list" {
type = list
default = [
"10.10.30.10", //private-1a
"10.10.40.10", //private-1c
]
}
# NLB
resource "aws_lb" "nlb" {
load_balancer_type = "network"
name = "${var.prefix}-nlb01"
internal = true
subnet_mapping {
subnet_id = "${var.private-subnet-1a-id}"
private_ipv4_address = "${element(var.target_list, 0)}" // "10.10.30.10"
}
subnet_mapping {
subnet_id = "${var.private-subnet-1c-id}"
private_ipv4_address = "${element(var.target_list, 1)}" // "10.10.40.10"
}
tags = {
Name = "${var.prefix}-nlb01"
}
}
Terraform Registry
2.ALBのターゲットグループへNLBの静的IPを紐づけ
- ALBのターゲットグループリソース(aws_lb_target_group)の引数へ「target_type = “ip”」をセットします。
- ターゲットグループへ連携先をアタッチするリソース(aws_lb_target_group_attachment)のtarget_id引数へNLBの静的IPをセットします。
※以下の例では「variable “target_list”」へ定義されている2つの静的IPがセットされます。
# ALB ターゲットグループ
resource "aws_lb_target_group" "alb" {
name = "${var.prefix}-alb-target01"
target_type = "ip"
vpc_id = "${var.vpc01-id}"
port = 80
protocol = "HTTP"
# ヘルスチェック
health_check {
port = 80
path = "/"
}
}
# ALBのターゲットグループへのターゲット紐づけ
resource "aws_lb_target_group_attachment" "alb" {
count = "${length(var.target_list)}"
target_group_arn = "${aws_lb_target_group.alb.arn}"
target_id = "${element(var.target_list, count.index)}" // "10.10.30.10"と"10.10.40.10"をセット
port = 80
}
Terraform Registry
まとめ
NLBへ静的IPがセット可能な事を知りませんでした。。。(ElasticIPなどもセット出来るようです。)
Web上でALB→NLBの構築例があまり見つけられなかったので、NLBへ静的IPがセット可能な事が判明するまでハマり続けていました。笑
コメント
aws consoleからだとローカルなip addressは固定でセットできないんですよね。