[Terraform] LoadBalancer 생성
🔎LoadBalancer
여러 대상 인스턴스 또는 컨테이너로 들어오는 트래픽을 분산시켜
애플리케이션의 가용성과 확장성을 향상시키는 중요한 구성 요소
HTTP 앱애는 ALB(Application Load Balancer)가 가장 적합하기 때문에, ALB를 생성해줄 것이다.
생성을 하기 전, ALB의 구성을 먼저 살펴보자
- 리스너 : 특정 포트와 프로토콜을 수신
- 리스너 규칙 : 리스너에 들어오는 요청을 가져옴 => 특정 경로 및 호스트 이름과 일치하는 요청을 대상 그룹으로 보냄
- 대상 그룹 : LB에서 요청을 받는 하나 이상의 서버, 서버의 상태를 확인하고 요청을 정상 노드로 보냄
ALB는 대상 그룹에 대상을 등록하고, 대상 그룹으로 트래픽을 라우팅한다.
작업 순서는 다음과 같다.
1. 로드 밸런서가 사용 할 보안 그룹 생성
2. ALB 생성 및 로드 밸런서의 DNS 네임 출력
3. ALB의 리스너를 정의
4. ASG의 대상 그룹 생성
5. 리스너 규칙을 생성하여 위 모든 부분을 연결
차례대로 진행 해보자
1. 보안 그룹 생성
먼저 LB가 사용 할 보안 그룹을 생성 해준다.
variable "alb_security_group_name" {
description = "The name of the security group for alb"
type = string
default = "allow_http_alb"
}
resource "aws_security_group" "alb" {
name = var.alb_security_group_name
vpc_id = aws_vpc.vpc.id
description = "Allow HTTP inbound traffics"
ingress {
description = "HTTP from VPC"
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
2. ALB 생성 & DNS NAME 출력
alb를 생성해준 뒤 output을 이용해 dns_name을 출력해준다.
resource "aws_lb" "alb" {
name = var.alb_name
load_balancer_type = "application"
subnets = [aws_subnet.subnet_a.id, aws_subnet.subnet_c.id]
security_groups = [aws_security_group.alb.id]
}
variable "alb_name" {
description = "The name of the ALB"
type = string
default = "tf-alb"
}
output "alb_dns_name" {
value = aws_lb.alb.dns_name
description = "The domain name of the load balancer"
}
3. 리스너 정의
default_action은 AWS ALB 리스너의 기본 동작을 정의하는 구성 요소다.
구성요소는 요청이 리스너에 도달했을 때 특정 동작을 수행하도록 지정한다.
resource "aws_lb_listener" "http" {
load_balancer_arn = aws_lb.alb.arn
port = var.server_port
protocol = "HTTP"
default_action {
type = "fixed-response"
fixed_response {
content_type = "text/plain"
message_body = "404: page not found\n"
status_code = 404
}
}
}
fixed_response 타입은 클라이언트가 요청을 보냈을 때 고정된 응답을 반환하도록 설정하는 동작이다.
즉, 리스너에 도착한 모든 요청에 대해 미리 정의된 응답을 반환한다.
4. 대상 그룹 생성
타겟 그룹을 생성하고 구성한다.
health_check 블록은 타겟 그룹에 대한 헬스 체크를 정의한다.
이를 통해 로드 밸런서가 인스턴스의 건강 상태를 확인할 수 있다.
resource "aws_lb_target_group" "asg" {
name = var.alb_name
port = var.server_port
protocol = "HTTP"
vpc_id = aws_vpc.vpc.id
health_check {
path = "/"
protocol = "HTTP"
matcher = "200"
interval = 15
timeout = 3
healthy_threshold = 2
unhealthy_threshold = 2
}
}
resource "aws_instance" "web2" {
ami = "ami-0c9c942bd7bf113a2" #ubuntu 22.04
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.web.id]
subnet_id = aws_subnet.subnet_a.id
key_name = aws_key_pair.tf-key.key_name
user_data = templatefile("userdata.tftpl", {
server_port = var.server_port
})
tags = {
Name = "tf-ec2"
}
}
4-1. 대상 그룹 연결
ALB 타겟 그룹에 인스턴스를 연결하는 리소스를 정의한다.
타겟 그룹에 속한 인스턴스가 로드 밸런서를 통해 트래픽을 수신하고, 로드 밸런서는 이를 여러 인스턴스로 분산시킨다.
resource "aws_lb_target_group_attachment" "alb-attach-instance"{
target_group_arn = aws_lb_target_group.asg.arn
target_id = aws_instance.web2.id
port = var.server_port
depends_on = [aws_lb_listener.http]
}
5. 리스너 규칙 생성 및 연결
리스너 규칙을 생성하고 구성한다.
condition 블록은 규칙이 적용 될 조건을 정의한다.
["*"] 는 모든 경로에 대해 규칙이 적용된다는 것을 의미한다.
resource "aws_lb_listener_rule" "asg" {
listener_arn = aws_lb_listener.http.arn
priority = 100
condition {
path_pattern {
values = ["*"]
}
}
action {
type = "forward"
target_group_arn = aws_lb_target_group.asg.arn
}
}
리스너 규칙을 생성하여 모든 경로에 대한 요청을 타겟 그룹으로 전달하는 동작을 정의한다.
로드 밸런서의 리스너는 수신한 요청을 해당 타겟 그룹으로 라우팅한다.
Resource 확인
모든 과정이 끝났으니
apply 한 후 결과를 확인해보자.
DNS 이름이 output으로 잘 출력이 된다.
dns이름:8080으로 접속을 해보면 페이지가 잘 뜨는 모습이 보인다.
AWS 콘솔에서도 LB가 잘 생성된 모습이 보인다.
근데 왜 영어로 보이는지 잘 모르겠다 .. ㅎㅎ🤔
나는 테스트용으로 인스턴스를 생성하여 연결했지만
AutoScaling으로 ALB를 연결하려고 하면 구성 방법이 달라진다.
aws_lb_target_group_attachment가 없어지고, AutoScaling 부분에 코드를 추가해준다.
resource "aws_autoscaling_group" "web" {
name_prefix = "asg-web-"
launch_configuration = aws_launch_configuration.web.name
vpc_zone_identifier = [aws_subnet.subnet_a.id, aws_subnet.subnet_b.id]
target_group_arn = [aws_lb_target_group.asg.arn]
health_check_type = "ELB"
}
Good🍀
'📚 IaC > Terraform' 카테고리의 다른 글
[Terraform] 의존성 관리 (depends_on) (0) | 2023.09.18 |
---|---|
[Terraform] RDS 생성 (0) | 2023.07.28 |
[Terraform] Key-Pair 생성 후 EC2 인스턴스 SSH 접속 (0) | 2023.07.03 |
[Terraform] AWS Custom VPC 생성 (0) | 2023.06.28 |
[Terraform] 템플릿 파일(Templatefile) (0) | 2023.06.21 |