9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TerraformでALBを作成する

Last updated at Posted at 2020-06-30

はじめに

この記事の続きです。今回はALBを作成します。
TerraformでEC2、セキュリティグループを作成する

以下がディレクトリ構成です。

% tree                                                                                              +[master]
.
├── README.md
├── main.tf
├── modules #追記
│   ├── alb
│   │   ├── Create-alb.tf #作成
│   │   ├── outputs.tf   #作成
│   │   └── variables.tf  #作成
│   ├── ec2
│   │   ├── Create-ec2.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── rds
│   │   ├── Create-rds.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── security_group
│   │   ├── Create-securitygroup.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   └── vpc
│       ├── Create-vpc.tf
│       ├── outputs.tf
│       └── variables.tf
├── outputs.tf
├── terraform.tfstate
├── terraform.tfstate.backup
└── variables.tf

コードの作成

main.tfにモジュールの利用を宣言

main.tfにて、alb用のセキュリティグループの作成、ALBの作成を行います。
セキュリティグループは前回作成したものを再利用。
ALBのパラメータは他モジュールからのinputや変わりそうなパラメータだけ抜き出しています。
terrarform destroyで簡単に削除できる様に、enable_deletion_protection = falseにしています。

./main.tf

########以下を追記########

module lb-sg {
  source = "./modules/security_group"

  sg_config = {
    name        = "lb-sg"
    vpc_id      = module.vpc.vpc_id
    protocol    = "tcp"
    port        = [80, 443]
    cidr_blocks = ["0.0.0.0/0"]
  }
}

module lb {
  source = "./modules/alb"

  lb_base_config = {
    public_subnet_id           = module.vpc.public_subnet_id
    sg_id                      = module.lb-sg.sg_id
    NameTag                    = "Terraform"
    enable_deletion_protection = false
  }
  lb_target_config = {
    port        = 80
    protocol    = "HTTP"
    vpc_id      = module.vpc.vpc_id
    path        = "/"
    instance_id = module.ec2.instance_id
  }
}
~~~

## 変数のinput

`module`で定義した変数を読み込みます。
セキュリティグループは前回の記事でinputしているので行う必要は無いです。

~~~terraform:./modules/alb/valiables.tf
variable "lb_base_config" {
  type = object({
    public_subnet_id           = list(string)
    sg_id                      = string
    NameTag                    = string
    enable_deletion_protection = string
  })
}
variable "lb_target_config" {
  type = object({
    port        = string
    protocol    = string
    vpc_id      = string
    path        = string
    instance_id = any
  })
}
~~~


## ALBの作成

health_checkの数値など一部ハードコートされてますが、この辺は変数化するなりすれば良いでしょう。
でも、あんまり変数化しすぎると訳がわからなくなります。。
`aws_lb_target_group_attachment`については、`target_id`がインスタンスIDのリストを受け入れてくれなかったので`count`方式にしています。

~~~terraform./modules/alb/Create-alb.tf
resource "aws_lb" "mylb" {
  name                       = var.lb_base_config.NameTag
  load_balancer_type         = "application"
  internal                   = false
  idle_timeout               = 60
  enable_deletion_protection = var.lb_base_config.enable_deletion_protection

  subnets = var.lb_base_config.public_subnet_id
}

resource "aws_lb_target_group" "myapp" {
  name                 = var.lb_base_config.NameTag
  port                 = var.lb_target_config.port
  protocol             = var.lb_target_config.protocol
  vpc_id               = var.lb_target_config.vpc_id
  deregistration_delay = "10"

  health_check {
    protocol            = var.lb_target_config.protocol
    path                = var.lb_target_config.path
    port                = var.lb_target_config.port
    healthy_threshold   = 5
    unhealthy_threshold = 2
    timeout             = 5
    interval            = 10
    matcher             = 200
  }
}

resource "aws_alb_listener" "myapp-http" {
  load_balancer_arn = aws_lb.mylb.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    target_group_arn = aws_lb_target_group.myapp.arn
    type             = "forward"
  }
}

resource "aws_lb_target_group_attachment" "myinstance" {
  count = length(var.lb_target_config.instance_id)
  target_group_arn = aws_lb_target_group.myapp.arn
  target_id        = element(var.lb_target_config.instance_id, count.index % length(var.lb_target_config.instance_id))
  port             = 80
}
~~~

## output

あとでわかりやすい様にALBDNS名をoutputします。

~~~terraform./modules/alb/outputs.tf
output "alb_dns_name" {
  value = aws_lb.mylb.dns_name
}
~~~
9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?