이번 실습은 단 두 개의 인스턴스를 미리 생성해놓고 로드밸런서에 이 두 개를 연결한다.
로드밸런서가 제공하는 Auto Scaling Group 기능을 사용하지 않고 직접 attachment를 사용해서 두 개의 인스턴스를 연결하는 것이므로 이 점에 유의해서 진행한다.
로드밸런서 생성은 다음과 같이 4단계로 구성된다. (aws docs 참고)
- 1단계: 대상 그룹 구성 => 로드밸런서가 특정 타겟들을 가리키려면 먼저 타겟 그룹(=대상그룹)을 만들어주어야 한다.
- 2단계: 대상(ALB Target Group) 등록 => 만들어놓은 대상 그룹에 로드밸런싱을 수행할 인스턴스를 연결한다.
- 3단계: 로드 밸런서 및 리스너(ALB Listener) 구성 => 리스너를 생성해서 요청을 적절한 대상 서버 또는 인스턴스로 전달한다.
- 4단계: 로드 밸런서 테스트
👇🏻 Terraform 으로 각 자원을 생성하는 docs는 아래의 표에서 참고할 수 있다.
자원 | 용도 |
ALB 만들기 | |
aws_alb_listener | Listener 와 Target Group 연결 |
aws_alb_listener_rule | Listencer의 Rule 만들기 |
aws_alb_target_group | Target Group 만들기 |
aws_alb_target_group_attachment | Target Group과 인스턴스 또는 컨테이너와 연결하기 |
0. 대상 인스턴스 준비
👇🏻 이전글을 참고해서 서로 다른 서브넷에 위치한 두 개의 인스턴스를 먼저 생성한다.
1. 대상 그룹 구성
resource "aws_lb_target_group" "test" {
name = "tf-example-lb-tg"
port = 80
protocol = "HTTP"
vpc_id = "vpc-056ee295a71f52bc3"
health_check {
interval = 15
path = "/index.html"
port = 80
protocol = "HTTP"
timeout = 5
unhealthy_threshold = 2
matcher = 200
}
}
👇🏻 AWS 콘솔에서 아래의 페이지 구성에 해당하는 부분이다. (사진이 많아서 접은 글로 넣어놓음)
2. 대상(ALB Target Group) 등록
resource "aws_lb_target_group_attachment" "test-2a" {
target_group_arn = aws_lb_target_group.test.arn
target_id = aws_instance.example-2a.id
port = 80
}
resource "aws_lb_target_group_attachment" "test-2c" {
target_group_arn = aws_lb_target_group.test.arn
target_id = aws_instance.example-2c.id
port = 80
}
앞서 말한대로 이번 실습에서는 오토 스케일링 기능을 사용하지 않고 직접 기존 인스턴스에 연결하는 것이므로 attachment를 사용하여 2a와 2c 서브넷에 만들어놓은 두 개의 인스턴스들을 타겟 그룹과 매핑해준다.
AWS 콘솔에서는 아래의 단계에 해당한다.
3. 로드 밸런서 및 리스너 구성
3-1. 로드밸런서 구성
resource "aws_lb" "test" {
name = "test-lb-tf"
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.lb_sg.id]
subnets = ["ap-northeast-2a의 서브넷 id", "ap-northeast-2c의 서브넷 id"]
enable_deletion_protection = false
tags = {
Environment = "production"
}
}
3-2. 리스너 구성
인스턴스와 매핑한 대상 그룹을 생성했으면 리스너에 대상그룹을 연결해준다.
리스너는 특정 IP 주소와 포트에서 클라이언트의 연결 요청을 듣고 그 연결 요청을 적절한 대상 서버 또는 인스턴스로 전달하는 역할을 수행한다.
여기서는 리스너에 HTTP프로토콜의 80번 포트로 요청이 들어오는 경우 지정한 대상그룹으로 전달하는 동작을 수행한다.
resource "aws_lb_listener" "test_listener" {
load_balancer_arn = aws_lb.test.arn
port = "80"
protocol = "HTTP"
# ssl_policy = "SSL_POLICY"
# certificate_arn = "CERTIFICATE_ARN"
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.test.arn
}
}
HTTPS를 사용하는 경우 인증서에 대한 정보를 ssl_policy, certificate_arn 속성에 지정할 수 있다.
👇🏻 AWS 콘솔에서는 로드밸런서 페이지의 `리스너 및 라우팅` 페이지에서 대상 그룹을 리스너에 등록할 수 있다.
▶️ 리스너 규칙 추가하기 (선택)
리스너 규칙을 사용하고 싶다면 아래의 코드를 활용할 수 있다.
resource "aws_lb_listener_rule" "test_listener_rule" {
listener_arn = aws_lb_listener.test_listener.arn
priority = 100
action {
type = "forward"
target_group_arn = aws_lb_target_group.test.arn
}
condition {
host_header {
values = ["example.com"]
}
}
}
이 리스너 규칙은 따로 작성하지 않으면 Defualt 규칙으로 지정된다.
AWS 콘솔에서는 아래의 단계에 해당한다.
4단계: 로드 밸런서 테스트
output.tf 작성
output "alb_dns_name" {
value = aws_lb.test.dns_name
}
직접 AWS 콘솔에 접속해서 찾아보지 않아도 output을 통해 DNS name을 확인할 수 있다. plan이나 apply명령어를 통해 반환된 DNS로 접속하면 아래와 같은 화면을 확인할 수 있다.
일정 간격으로 새로고침을 하면 같은 도메인에 연결된 다른 웹서버의 index.html이 출력됨을 확인할 수 있다.
다음 실습에서는 VPC를 직접 생성해서 네트워크과 리소스를 직접 구성해보자! 👾
'DevOps > Terraform' 카테고리의 다른 글
[Terraform] 1. 인스턴스 생성 (0) | 2023.08.08 |
---|
댓글