새소식

IaC/Terraform

2주차(2)_Terraform을 통한 다중 웹 서버 배포 (ASG & ELB)

  • -
CloudNet@ 팀의 가시다님께서 Leading 하시는 Terraform T101 Study 내용 요약

 

해당 Terraform Study 는 Terraform Up and Running 책을 기반으로 진행 중입니다.

 

 

이전 글에서 배포한 VPC에 서버를 배포해보자 !!

 

1. Architecture


 

 

2. 웹 서버를 위한 sg.tf 파일 생성


  • http를 위해 80 포트 Open

resource "aws_security_group" "scott_sg" {
  vpc_id      = aws_vpc.scott_vpc.id
  name        = "terraform SG"
  description = "terraform Study SG"
}

resource "aws_security_group_rule" "scott_sg_inbound" {
  type              = "ingress"
  from_port         = 0
  to_port           = 80
  protocol          = "tcp"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.scott_sg.id
}

resource "aws_security_group_rule" "scott_sg_outbound" {
  type              = "egress"
  from_port         = 0
  to_port           = 0
  protocol          = "-1"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.scott_sg.id
}

 

 

3. Auto Scaling Group 을 위한 asg.tf 파일 생성


3.1. Launch Configuration 생성

resource "aws_launch_configuration" "scott_launch_config" {
  name_prefix     = "terraform-launch-config-"
  image_id        = "ami-0e9bfdb247cc8de84"
  instance_type   = "t2.micro"
  security_groups = [aws_security_group.scott_sg.id]
  associate_public_ip_address = true

  user_data = <<-EOF
              #!/bin/bash
              wget https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/busybox-x86_64
              mv busybox-x86_64 busybox
              chmod +x busybox
              RZAZ=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone-id)
              IID=$(curl 169.254.169.254/latest/meta-data/instance-id)
              LIP=$(curl 169.254.169.254/latest/meta-data/local-ipv4)
              echo "<h1>RegionAz($RZAZ) : Instance ID($IID) : Private IP($LIP) : Web Server</h1>" > index.html
              nohup ./busybox httpd -f -p 80 &
              EOF

  # Required when using a launch configuration with an auto scaling group.
  lifecycle {
    create_before_destroy = true
  }
}

 

Lifecycle 이란??

원래 테라폼은 새로운 리소스를 생성할 때, 기존 리소스를 삭제한 후에 생성한다.
하지만 "create_before_destroy = true" 를 통해 리소스 교체를 반대로 할 수 있다. (새로운 리소스 생성 후, 기존 리소스 삭제)

 

 

왜 해당 옵션이 필요한가에 대해 의문을 가질 수 있다.

이는 AWS 리소스에 대한 이해가 필요한데, 시작 구성은 한 번 생성하면 변경이 불가능한 리소스이다. (새로 생성해야 함)

 

 

이 때 문제가 발생하는 데

Auto Scaling 이 Launch Configuration 을 참조(Reference)하여 구성되어 있으므로,

디폴트 설정으로는 해당 리소스를 제거할 수 없다.

 

Launch Configuration 에 변경을 가하면 삭제 후 생성해야 하는데,
삭제하면 Auto Scaling이 참조하는 내용이 없어지므로 오류가 발생 !

 

따라서 "create_before_destroy = true" 옵션을 통해

Auto Scaling 이 참조할 수 있는 새로운 리소스를 생성 후 이전 리소스를 삭제하도록 해야한다.

 

 

3.2. Auto Scaling Group 생성

resource "aws_autoscaling_group" "scott_asg" {
  name                 = "scott_asg"
  launch_configuration = aws_launch_configuration.scott_launch_config.name
  vpc_zone_identifier  = [aws_subnet.scott_subnet_01.id, aws_subnet.scott_subnet_02.id]
  min_size = 2
  max_size = 10

  health_check_type = "ELB"
  target_group_arns = [aws_lb_target_group.scott_alb_tg.arn]

  tag {
    key                 = "Name"
    value               = "terraform-asg"
    propagate_at_launch = true
  }
}

 

 

4. Load Balancer 를 위한 alb.tf 파일 생성


4.1. ALB 생성


resource "aws_lb" "scott_alb" {
  name               = "terraform-alb"
  load_balancer_type = "application"
  subnets            = [aws_subnet.scott_subnet_01.id, aws_subnet.scott_subnet_02.id]
  security_groups = [aws_security_group.scott_sg.id]

  tags = {
    Name = "terraform-alb"
  }
}

 

4.2. ALB Target Group 생성


resource "aws_lb_target_group" "scott_alb_tg" {
  name = "terraform-alb-tg"
  port     = 80
  protocol = "HTTP"
  vpc_id   = aws_vpc.scott_vpc.id

  health_check {
    path                = "/"
    protocol            = "HTTP"
    matcher             = "200-299"
    interval            = 5
    timeout             = 3
    healthy_threshold   = 2
    unhealthy_threshold = 2
  }
}

 

4.3. ALB Listener 생성


resource "aws_lb_listener" "scott_http" {
  load_balancer_arn = aws_lb.scott_alb.arn
  port              = 80
  protocol          = "HTTP"

  # By default, return a simple 404 page
  default_action {
    type = "fixed-response"

    fixed_response {
      content_type = "text/plain"
      message_body = "404: page not found - Kimalarm's terraform Study"
      status_code  = 404
    }
  }
}

resource "aws_lb_listener_rule" "scott_alb_rule" {
  listener_arn = aws_lb_listener.scott_http.arn
  priority     = 100

  condition {
    path_pattern {
      values = ["*"]
    }
  }

  action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.scott_alb_tg.arn
  }
}

 

4.4. ALB Domain Output 출력

output "scott_alb_dns" {
  value       = aws_lb.scott_alb.dns_name
  description = "The DNS Address of the ALB"
}

 

5. 리소스 확인


5.1. Terraform 배포

terraform init && terraform plan && terraform apply -auto-approve

 

5.2. Auto Scaling 확인

 

5.3. ALB 확인

 

5.4. ALB Domain 확인

 

  • 새로고침을 눌러서 다른 Web Server 로 트래픽이 들어가는 지 확인해보자

 

실습 진행 후에는 반드시 리소스를 삭제하자!
terraform destroy -auto-approve

 


 

다음에는 Terraform 상태파일 격리에 대해서 알아보겠다.

 

Contents

포스팅 주소를 복사했습니다