TerraformでALBを構築してみる

# はじめに
Terraformの勉強を始めたので備忘録を兼ねて行ったことを投稿しようと思います。
以下の4つの投稿内容を実施した上でALBの構築を行なっています。
[TerraformをインストールしてTerraformでAWS上にEC2作ってみる](https://qiita.com/kakita-yzrh/items/1357a219b4a891a441ff)
[TerraformでIAMを設定してEC2にセッションマネージャー経由で接続してみる](https://qiita.com/kakita-yzrh/items/980f3209d587e7e349a6)
[Terraformでセキュリティグループを設定してEC2にhttp接続する](https://qiita.com/kakita-yzrh/items/6bdc11f2882c67a949ad)
[TerraformでVPCを構築してみる](https://qiita.com/kakita-yzrh/items/cccf954daaa3de59d370)

# TerrafromにALBの定義を追加
### ALB
```terraform:alb.tf
resource "aws_lb" "test_alb" {
  name               = "test_alb"
  internal           = false
  load_balancer_type = "application"
  security_groups = [aws_security_group.test.id]

  subnets = [
    aws_subnet.demo_subnet_a.id,
    aws_subnet.demo_subnet_c.id
  ]

  ip_address_type = "ipv4"

  tags = {
    Name = "tf_test_alb"
  }
}
```
`security_groups`には以下で作成したhttp接続を許可するセキュリティグループを設定
[http接続用のセキュリティグループを定義](https://qiita.com/kakita-yzrh/items/6bdc11f2882c67a949ad#terraform%E3%81%A7%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%82%92%E8%A1%8C%E3%81%86)

`subnets`には以下で作成したサブネットを設定
[サブネットを定義](https://qiita.com/kakita-yzrh/items/cccf954daaa3de59d370#%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B)

### ターゲットグループ
```terraform:alb.tf
resource "aws_lb_target_group" "test_target_group" {
  name             = "test_target_group"
  target_type      = "instance"
  protocol_version = "HTTP1"
  port             = 80
  protocol         = "HTTP"

  vpc_id = aws_vpc.test_vpc.id

  tags = {
    Name = "tf_test_target_group"
  }

  health_check {
    interval            = 30
    path                = "/"
    port                = "traffic-port"
    protocol            = "HTTP"
    timeout             = 5
    healthy_threshold   = 5
    unhealthy_threshold = 2
    matcher             = "200,301"
  }
}
```
`vpc_id`には以下で作成したVPCを設定
[VPCを定義](https://qiita.com/kakita-yzrh/items/cccf954daaa3de59d370#vpc%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B)

### ターゲットグループのインスタンス設定
```terraform:alb.tf
resource "aws_lb_target_group_attachment" "test_target_ec2" {
  target_group_arn = aws_lb_target_group.test_target_group.arn
  target_id        = aws_instance.test.id
}
```
`target_id`には以下でサブネットを指定したEC2インスタンスを設定
[EC2を構築するサブネット指定する](https://qiita.com/kakita-yzrh/items/cccf954daaa3de59d370#ec2%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B)
※本来は複数のインスタンスを設定しますが、テストなので一つしか設定していません

### リスナーの設定
```terraform:alb.tf
resource "aws_lb_listener" "test_listener" {
  load_balancer_arn = aws_lb.test_alb.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.test_target_group.arn
  }
}
```

# Terraformで定義したALBを反映
### Terraformのplan applyを実行
terraformのplan applyを実行して、AWS上にリソースを反映します。

```
terraform plan
terraform apply
```

### http接続を行う
AWSコンソールのALBのページを開き、作成したALBの`DNS　name`をコピーして
ブラウザからアクセスできるか確認します。

# 作成したリソースの削除
terraformのdestroyを実行して、AWS上のリソースを削除します。
```
terraform destroy
```

# さいごに
今回でWEBアプリケーションの構築に必要なリソースを一通り作成できました。
次回はansibleを使って、ミドルウェアの部分をコード化できるようにしようと思います。