로드밸런서:
로드밸런서 타입(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
}
}