본문 바로가기

AWS Cloud

[AWS - Terraform] Load Balancer

반응형

* 참조 사항
- 필자는 학습을 목적으로 main.tf에 전체 인프라 구축 코드를 작성하였으며, 이에 대해 각기 설명함
- .tf 파일을 resource 별로 분할할 시, 필자와 코드가 다를 수 있음
- Terraform 기초부터 순차적으로 보길 권장 (1번 게시물의 이해가 매우 중요)

1. Architecture Create : https://isc9511.tistory.com/163

2. Bucket 생성 및 파일 업로드 : https://isc9511.tistory.com/164

3. IAM Role 생성 및 정책 Attachment : https://isc9511.tistory.com/165

4. Network Setting : https://isc9511.tistory.com/166

5. RDS 생성 : https://isc9511.tistory.com/167

6. Instance(EC2) 생성 : https://isc9511.tistory.com/168

7. Auto Scaling 생성 : https://isc9511.tistory.com/169

 

 

 

* ELB (Elastic Load Balancer) : 하나 이상의 가용 영역(AZ)에 있는 여러 대상이 수신하는 트래픽을 자동으로 분산하도록 지정하는 로드 밸런서
- Application / Gateway / Network LB 3가지 유형으로 구분

 

 

 

* Code 내용
- 아래에서는 Application Load Balancer(ALB)를 생성하는 코드를 사용

- ALB 생성 -> ALB Target Group 생성 -> ALB Listener 생성 -> 원본 EC2(Auto Scaling 미포함)를 ALB Target Group으로 연결

1) ALB 생성

# ALB 생성
resource "aws_lb" "app-tier-internal-lb"{
  name = "app-tier-internal-lb"
  internal = true	 # true = 내부(internal) / false = 외부(Internet-facing)
  load_balancer_type = "application" # Default - application, 다른 하나는 gateway
  security_groups = [aws_security_group.internal-alb-sg.id]
  subnets = [aws_subnet.private-subnet-az1.id, aws_subnet.private-subnet-az2.id]
  depends_on = [aws_ami_from_instance.app-layer-AS-template-ami] # AppEC2 완전 생성 후 ALB 생성 시작
  tags = {
      Name = "app-tier-internal-lb"
  }
}

2) ALB Target Group(TG) 생성 - ALB가 트래픽을 전송하기 위한 조건 Group의 설정

# ALB Target Groups
resource "aws_lb_target_group" "app-tier-alb-tg"{
  name    = "app-tier-alb-tg"
  port    = "4000"
  protocol   = "HTTP"
  vpc_id  = aws_vpc.three-tier-vpc.id
  target_type = "instance"
  
  health_check {
    path = "/health" # 앞서 AppInstance 사전 구축 시, curl로 헬스 체크 테스트했던 경로
    protocol = "HTTP"
    healthy_threshold  = 2 # 헬스 체크 문제 시, 정상 요청 반환이 될때까지의 최대 재요청 수(정상 간주)
    unhealthy_threshold = 2 # 헬스 체크 문제 시, 최대 실패 횟수 Limit
      # 결론은 헬스 체크 제대로 안될 때 최대 2번까지는 시도한다
    interval = 30 # 헬스 체크 인터벌(초)
    timeout = 5 # 해당 시간(초)내 응답이 없으면 실패 간주
  }

  tags = {
      Name = "app-tier-alb-tg"
  }
}

3) ALB Listener 생성 - 외부에서 ALB가 수신하는 트래픽

# ALB listener
resource "aws_lb_listener" "app-alb-listner"{
  load_balancer_arn = aws_lb.app-tier-internal-lb.arn
  port = "80"
  protocol = "HTTP"
  default_action {
      type = "forward"
      target_group_arn = aws_lb_target_group.app-tier-alb-tg.arn
  }
}

4) 원본 EC2(Auto Scaling 비포함)를 ALB Target Group으로 연결

# 구성한 ALB에 attach할 대상 지정 (원본 인스턴스 Attach)
  # aws_lb_target_group_attachment의 경우 기존 원본 EC2 또는, 컨테이너, 람다 대상으로만 지정 가능
    # ASG에서 생성 된 인스턴스의 경우 aws_autoscaling_group에서 매개변수를 사용하여 타겟 그룹에 등록해야함
resource "aws_lb_target_group_attachment" "internal-alb-attach-resource"{
  target_group_arn = aws_lb_target_group.app-tier-alb-tg.arn
  target_id = aws_instance.applayer.id
  port = 4000
  depends_on = [aws_lb_listener.app-alb-listner]
}
# 만약 위 방식으로 ASG에서 생성된 인스턴스들의 Target_id를 별도로 지정 시, 에러 발생

 

 

 

* 주의 사항
- 코드가 길어질 수록 종속성 문제가 다수 발생하기 때문에 아키텍처의 생성 순서에 대한 이해가 필수적(depends_on)

- LB Target Group에 EC2들을 연결할 시, 원본 인스턴스인지, Auto Scaling으로 생성된 인스턴스인지에 따라서 구현 코드가 다르게 적용 (아래는 Auto Scaling으로 생성된 인스턴스를 Target Group에 적용되도록 하는 Code)

### 7번 게시물(Auto Scaling 생성 코드 중, target_group_arns 부분이 Auto Scaling에서 생성된 인스턴스를 Target Group에 적용하는 코드)
# Auto Scaling Group 생성
resource "aws_autoscaling_group" "applayer-autoscaling-group" {
  name = "AppTierASG"
  launch_configuration = aws_launch_configuration.applayer-launch-config.name
  vpc_zone_identifier = [aws_subnet.private-subnet-az1.id, aws_subnet.private-subnet-az2.id]
  desired_capacity = 2
  max_size = 2
  min_size = 2
  health_check_grace_period = 300
  health_check_type = "EC2"

  target_group_arns = [aws_lb_target_group.app-tier-alb-tg.arn]
    # ASG에서 생성된 인스턴스의 경우 위 방식으로 LoadBalancer TargetGroup에 등록 가능
  depends_on = [aws_lb_target_group.app-tier-alb-tg]
    # LB Target Group이 생성되어 ARN이 지정된 후 위 명령어가 사용될 수 있기 때문에 Depends_on 사용
}

 

 

 

 

반응형