본문 바로가기
DevOps/Terraform

[Terraform] 2. 로드밸런서 생성 및 연결

by 태옹 2023. 8. 8.

이번 실습은 단 두 개의 인스턴스를 미리 생성해놓고 로드밸런서에 이 두 개를 연결한다.

로드밸런서가 제공하는 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. 대상 인스턴스 준비

👇🏻 이전글을 참고해서 서로 다른 서브넷에 위치한 두 개의 인스턴스를 먼저 생성한다.

 

[Terraform] 1. 인스턴스 생성

👇🏻 이전글 참고 Cloud9에서 키페어 생성 후 AWS에 등록 키페어를 생성하는 방법에는 다음의 두 가지 방법이 있다. 1. AWS 콘솔에서 키페어 생성 -> Cloud9 인스턴스로 가지고 오기 2. Cloud9 인스턴스

taetoungs-branch.tistory.com

 

 

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단계: 로드 밸런서 테스트

pluralith를 사용해서 현재 구성 시각화

 

 

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

댓글