TerraformでNLB構築

# はじめに

本記事はTerraformを使ったNLBの構築方法を紹介します。
今回は、シンプルにNLBとセキュリティグループをTerraformで構築してみましたので構築例をご紹介いたします。

# 前提条件
今回は話を簡単にするため、VPC、IGW、サブネット、EC2は作成済み。
下記構成図におけるNLBとNLBにアタッチするセキュリティグループ(SG)をTerraformで構築します。

<div style="text-align: center;">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3966995/962050df-fb31-48ee-badc-080aeeff5b0d.png" width="70%" style="display: block; margin: 0 auto;">
</div>


# セキュリティグループ

まずはSecurity Groupを作成します。

・security_group.tf
```# NLB用セキュリティグループ
#セキュリティグループ本体
resource "aws_security_group" "sg_nlb" {
  vpc_id = <VPCのID>"
  name   = "nlb-alpha-sg"
}

#インバウンドルール1
resource "aws_vpc_security_group_ingress_rule" "allow_http" {
  from_port         = 80
  to_port           = 80
  ip_protocol       = "tcp"
  cidr_ipv4         = "172.31.0.11/32"　#適当に許可したいIPアドレス
  security_group_id = aws_security_group.sg_nlb.id
}

#インバウンドルール2
resource "aws_vpc_security_group_ingress_rule" "allow_https" {
  from_port         = 443
  to_port           = 443
  ip_protocol       = "tcp"
  cidr_ipv4         = "172.31.0.11/32"　#適当に許可したいIPアドレス
  security_group_id = aws_security_group.sg_nlb.id
}

#アウトバウンドルール1
resource "aws_vpc_security_group_egress_rule" "allow_all" {
  ip_protocol       = "-1"
  cidr_ipv4         = "0.0.0.0/0"
  security_group_id = aws_security_group.sg_nlb.id
}
```

# NLB
続いてNLBを作成します。

・NLB.tf
```
# NLB本体
resource "aws_lb" "nlb" {
  name               = "nlb-alpha"
  internal           = false
  load_balancer_type = "network"
  security_groups    = [aws_security_group.sg_nlb.id]
  subnets = ["<サブネットID>"]
  
}

# NLBのターゲットグループ(HTTP)
resource "aws_lb_target_group" "tg_nlb_80" {
  name        = "tg-nlb-80"
  port        = 80
  protocol    = "TCP"
  vpc_id      = "<VPCID>"
  target_type = "instance"
}

# NLBのターゲットグループへのターゲット紐づけ(HTTP)
resource "aws_lb_target_group_attachment" "tg_nlb_attachment_80" {
  target_group_arn = aws_lb_target_group.tg_nlb_80.arn
  target_id        = "<EC2インスタンスID>"
}

# NLBのリスナー設定（NLBとターゲットグループの紐づけ）(HTTP)
resource "aws_lb_listener" "listener_nlb_80" {
  load_balancer_arn = aws_lb.nlb.arn
  port              = 80
  protocol          = "TCP"
  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.tg_nlb_80.arn
  }
}

# NLBのターゲットグループ(HTTPS)
resource "aws_lb_target_group" "tg_nlb_443" {
  name        = "tg-nlb-443"
  port        = 443
  protocol    = "TCP"
  vpc_id      = "<VPCID>"
  target_type = "instance"
}

# NLBのターゲットグループへのターゲット紐づけ(HTTPS)
resource "aws_lb_target_group_attachment" "tg_nlb_attachment_443" {
  target_group_arn = aws_lb_target_group.tg_nlb_443.arn
  target_id        = "<EC2インスタンスID>"
}

# NLBのリスナー設定（NLBとターゲットグループの紐づけ）(HTTPS)
resource "aws_lb_listener" "listener_nlb_443" {
  load_balancer_arn = aws_lb.nlb.arn
  port              = 443
  protocol          = "TCP"
  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.tg_nlb_443.arn
  }
}
```

# 構築されたリソース
・セキュリティグループ

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3966995/c836fa93-9776-36fb-80ad-a117cdecba7d.png)

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3966995/88717c3c-5743-9541-8db0-6c22243c95d0.png)


・NLB

![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3966995/1a8f712d-6d0c-f2e6-b497-a8041559752c.png)


# おわりに
今回の基礎編ではterraformを使って簡単なNLB、SGの構築を紹介しました。
次回は大量の外部IPアドレスからのインバウンドルールをterraformで簡単に管理する方法を紹介予定です。