로드밸런서:

  • 로드밸런서 타입(Network or Application) 설정

  • 서브넷 설정

  • 보안그룹 설정

resource "aws_lb" "alb" {
  name_prefix        = var.alb_name
  load_balancer_type = "application"
  subnets            = data.aws_subnets.default.ids
  security_groups    = [aws_security_group.alb.id]
}

로드밸런서 리스너:

  • 특정 로드밸런서 참조 설정

  • 요청에서 포트와 프로토콜 확인.

  • default action: 리스너 규칙에 정의되지 않은 요청 들어올시 반환할 응답값 설정

resource "aws_lb_listener" "http" {
  load_balancer_arn = aws_lb.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\n"
      status_code  = 404
    }
  }
}

로드밸런서 리스너 규칙:

  • 특정 리스너를 참조 설정

  • 클라이언트의 요청이 어떤 경로에 대한 요청인지 패턴 분석.

  • 어떤 경로일때 어디로 보내야하는지를 “로드밸런서 타겟그룹“으로 지정 즉, 리스너 규칙에는 리스너와 타겟그룹 연결작업이 진행된다.

resource "aws_lb_listener_rule" "asg" {
  listener_arn = aws_lb_listener.http.arn
  priority     = 100

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

  # action: 요청이 조건의 규칙을 만족할때 수행될 동작 정의
  action { 
    type             = "forward"
    target_group_arn = aws_lb_target_group.asg.arn
  }
}
⚠️

만약 요청이 “/static1/“경로로 시작할때는 대상그룹A로 전달하고, “/static2/“경로로 시작할때는 대상그룹B로 전달하도록 설정하기 위해서는 하나의 aws_lb_listener_rule이 아니라 2개의 aws_lb_listener_rule과 2개의 대상그룹으로 가능.

**예시코드**
# 대상 그룹 A 설정
resource "aws_lb_target_group" "group_a" {
  // 대상 그룹 A에 대한 설정...
}

# 대상 그룹 B 설정
resource "aws_lb_target_group" "group_b" {
  // 대상 그룹 B에 대한 설정...
}

# "/static1/" 경로로 시작하는 요청을 대상 그룹 A로 라우팅
resource "aws_lb_listener_rule" "rule_static1" {
  listener_arn = aws_lb_listener.front_end.arn
  priority     = 100

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

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

# "/static2/" 경로로 시작하는 요청을 대상 그룹 B로 라우팅
resource "aws_lb_listener_rule" "rule_static2" {
  listener_arn = aws_lb_listener.front_end.arn
  priority     = 110

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

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

로드밸런서 타겟 그룹

  • 헬스체크를 하는 주체는 로드밸런서이지만, 인스턴스 집합에 대해 구체적으로 어떤방식으로 헬스체크할지 설정되는 명세서

  • 오토스케일링 그룹에서 EC2 생성시, 그 EC2는 이 타겟그룹에 포함되어 생성된다.

  • 로드밸런서 타겟그룹은 **“로드밸런서 리스너 규칙”**에서 참조하기도 하고 **“오토스케일링 그룹”**에서 참조하기도 함

  • 오토스케일링 그룹에서 로드밸런서 타겟그룹을 참조하는 이유:

    • 오토스케일링 그룹의 헬스체크 특징: 로드밸런서 뿐만 아니라 오토스케일링도 헬스체크 기능을 제공한다.

      • 다만, Default 헬스체크인 “EC2 타입”으로는 대상그룹의 상태를 확인하지 않고 인스턴스 자체의 상태를 기반으로 헬스체크한다. AWS는 EC2 인스턴스의 상태를 주기적으로 확인하고, 인스턴스가 ‘running’ 상태에서 벗어나면 문제가 있는 것으로 간주한다. 이 방식은 인스턴스가 OS 수준에서 정상적으로 작동하고 있는지를 확인하지만, 애플리케이션 수준의 문제는 감지하지 못할 수 있다.

      • 반면 ELB 타입으로 설정되면 로드밸런서 타겟그룹도 함께 설정이 요구된다, 결과적으로 로드밸런서가 타겟그룹에 속한 EC2들에게 타겟그룹에 설정된 내용을 견적대로 헬스체크를 할 수 있게된다.

    • 따라서, 로드 밸런서와 오토스케일링은 모두 헬스 체크를 진행하긴 하지만, 각각의 헬스 체크는 서로 다른 목적으로 사용된다.

    • 로드 밸런서는 요청을 정상적으로 처리할 수 있는 서버로만 요청을 전달하는 데 집중하는 반면,

    • 오토스케일링의 헬스 체크는 그룹 내 인스턴스의 상태를 모니터링하고, 필요한 경우 인스턴스를 교체하는 데 중점을 둔다.

    • 두 시스템은 함께 작동하여 인프라의 가용성과 탄력성을 높이는 데 기여한다.

resource "aws_lb_target_group" "asg" {
  name     = var.alb_name
  port     = 80
  protocol = "HTTP"
  vpc_id   = data.aws_vpc.default.id

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