Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add ASG instances in target group via Terraform

I have a Terraform script which creates a launch config, autoscaling group, a single ALB, one target group and a listener. The instances are launched using the autoscaling group.

How can I add the newly launched instances in target group via Terraform in the same script?

resource "aws_launch_configuration" "CF2TF-LC" {
  name                 = "CF2TF-LC"
  depends_on           = ["aws_iam_role_policy_attachment.CF2TF-IAM-PA", "aws_security_group.CF2TF-SG-Web"]
  image_id             = "ami-14c5486b"
  instance_type        = "t2.micro"
  iam_instance_profile = "${aws_iam_instance_profile.CF2TF-IAM-IP.id}"
  key_name             = "CF2TF"
  security_groups      = ["${aws_security_group.CF2TF-SG-Web.id}"]
  user_data            = "${template_file.CF2TF-UserData.rendered}"
}

resource "aws_autoscaling_group" "CF2TF-ASG" {
  name                      = "CF2TF-ASG"
  depends_on                = ["aws_launch_configuration.CF2TF-LC"]
  vpc_zone_identifier       = ["${aws_subnet.CF2TF-Subnet-1a.id}", "${aws_subnet.CF2TF-Subnet-1d.id}"]
  max_size                  = 3
  min_size                  = 2
  health_check_grace_period = 300
  health_check_type         = "EC2"
  desired_capacity          = 2
  force_delete              = true
  launch_configuration      = "${aws_launch_configuration.CF2TF-LC.id}"
}

resource "aws_lb" "CF2TF-ALB" {
  name               = "CF2TF-ALB"
  subnets            = ["${aws_subnet.CF2TF-Subnet-1a.id}", "${aws_subnet.CF2TF-Subnet-1d.id}"]
  internal           = false
  load_balancer_type = "application"
  security_groups    = ["${aws_security_group.CF2TF-SG-Web.id}"]

  tags {
    Name        = "WebSrv"
    Environment = "Dev"
  }
}

resource "aws_lb_target_group" "CF2TF-TargetGroup" {
  name        = "CF2TF-TargetGroup"
  depends_on  = ["aws_vpc.CF2TF-VPC"]
  port        = 80
  protocol    = "HTTP"
  vpc_id      = "${aws_vpc.CF2TF-VPC.id}"
  target_type = "instance"

  health_check {
    interval            = 30
    path                = "/index.html"
    port                = 80
    healthy_threshold   = 5
    unhealthy_threshold = 2
    timeout             = 5
    protocol            = "HTTP"
    matcher             = "200,202"
  }
}

resource "aws_lb_listener" "CF2TF-ALB-Listener" {
  //depends_on = ["aws_lb.CF2TF-ALB.id", "aws_lb_target_group.CF2TF-TargetGroup.id"]
  load_balancer_arn = "${aws_lb.CF2TF-ALB.arn}"
  port              = "80"
  protocol          = "HTTP"

  default_action {
    target_group_arn = "${aws_lb_target_group.CF2TF-TargetGroup.arn}"
    type             = "forward"
  }
}
like image 411
Kalim Avatar asked Jun 04 '18 09:06

Kalim


2 Answers

The aws_autoscaling_group resource takes a target_group_arns parameter that will register the ASG with the target group so that all instances are registered with the load balancer's target group as they come up and properly drained from the load balancer before being terminated.

As such your ASG resource should look something like this:

resource "aws_autoscaling_group" "CF2TF-ASG" {
  name                      = "CF2TF-ASG"
  depends_on                = ["aws_launch_configuration.CF2TF-LC"]
  vpc_zone_identifier       = ["${aws_subnet.CF2TF-Subnet-1a.id}", "${aws_subnet.CF2TF-Subnet-1d.id}"]
  max_size                  = 3
  min_size                  = 2
  health_check_grace_period = 300
  health_check_type         = "EC2"
  desired_capacity          = 2
  force_delete              = true
  launch_configuration      = "${aws_launch_configuration.CF2TF-LC.id}"
  target_group_arns         = ["${aws_lb_target_group.CF2TF-TargetGroup.arn}"]
}
like image 124
ydaetskcoR Avatar answered Nov 16 '22 03:11

ydaetskcoR


The aws_autoscaling_group resource implements a parameter, target_group_arns to do exactly what you need. Just add this line to your autoscaling group resource:

target_group_arns = "${aws_lb_target_group.CF2TF-TargetGroup.arn}"
like image 28
Ignacio Millán Avatar answered Nov 16 '22 02:11

Ignacio Millán