AWS-3Tier

[AWS-3Tier] Terraform을 이용한 Load balancer 생성

후루루탕후루 2022. 1. 6. 00:45

1. Load Balancer란?

2. alb와 nlb의 차이

3. Terraform을 이용한 구성

 

인스턴스까지 만들었으니 로드밸런서를 생성할 차례이다.

 

 

 

1. Load Balancer란?

로드밸런서는 서브넷으로 몰리는 트래픽을 효과적으로 처리하기 위한 리소스이다.

부하분산이라고도 불리운다.

마치 너무 많이 나온 장어구이집의 장어값을 더치페이 하는 것과 비슷한...

 

 

2. alb와 nlb의 차이

우리가 주로 쓰는 로드밸런서의 종류는 Application Load Balancer(이하 alb), Network Load Balancer(이하 nlb)가 있다.

 

alb란 이름 그대로 '애플리케이션' 계층에서 동작하는 로드밸런서로, 외부에서의 트래픽을 받아줄 수 있다는 특징이 있다. 7계층인 애플리케이션 계층까지 확인하기 때문에, nlb보다 더 많은 기능을 지원한다.

또한 경로기반 라우팅을 지원하기 때문에, 특정 path로 들어오는 경우, 이를 다른 서버에 라우팅 시켜줄 때 유용하다.

우리는 이런 특징을 이용해서 기존 alb뒤에 health.html 이라는 경로를 더해 health check를 할 것이다.

 

nlb는 '네트워크' 계층에서 동작하는 로드밸런서를 말한다.

alb와 비교해 보다 네트워크 계층까지만 확인을 하기 때문에 보다 처리속도가 빠르며, 서버 내부에서만 삥글삥글 도는 로드밸런서이다. 때문에 보안그룹도 필요없음!!!!

처리속도가 빠르기 때문에 트래픽이 극도로 많은 경우의 네트워크 상황에서 주로 쓰인다.

 

여튼 이러한 alb, nlb의 구성 또한 테라폼으로 진행해보려 한다. 

 

사실 로드밸런서 이후의 내용들은 개념이 명확하지 않다면 꼭!!꼭!!!!! 콘솔로 손으로 일일히 해보고 테라폼을 돌리는 것을 추천한다. 

진짜 뭐가 뭔지 리스너가 뭔지 타겟그룹이 뭔지 하나도 모르는 불상사가 생길 수 있다..

 

 

3. Terraform을 이용한 구성

이제 진짜 테라폼으로 구성해볼 차례이다.

먼저 alb부터!! 

 

모든 정보는 https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb

에 존재한다. 모르겠으면 참고하시길ㅎㅎ

 

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb

 

registry.terraform.io

resource "aws_lb" "test_alb" {
  name               = "test-alb"                     #로드밸런서의 이름
  internal           = false                          #true인 경우 내부 로드밸런서(nlb)가 된다.
  load_balancer_type = "application"                  #로드밸런서의 타입설정
  security_groups    = [aws_security_group.sg_alb.id] #alb는 보안그룹이 존재한다.
  subnets            = [aws_subnet.test_pub1.id, aws_subnet.test_pub2.id]
  #로드밸런서와 연결될 서브넷을 지정해준다. alb는 인터넷이 되는 서브넷만 연결 가능!
  tags = {
    "Name" = "test-alb"
  }
}

resource "aws_lb_target_group" "test_albtg" {
  name        = "test-albtg"    #로드밸런서의 타겟그룹.
  port        = 80              #로드밸런서가 수신대기 하는 포트
  protocol    = "HTTP"          #ALB의 경우 유효한 프로토콜이 HTTP, HTTPS이다.
  target_type = "instance"  
  vpc_id      = aws_vpc.test_vpc.id     #로드밸런서가 속할 VPC

  health_check {            #로드밸런서의 Health check
    enabled             = true
    healthy_threshold   = 3
    interval            = 5
    matcher             = "200"
    path                = "/health.html"    #alb의 dns 뒤에 /health.html을 더해 확인할 수 있다.
    port                = "traffic-port"
    protocol            = "HTTP"
    timeout             = 2
    unhealthy_threshold = 2
  }
}

resource "aws_lb_listener" "test_alblis" {  #alb의 리스너를 지정
  load_balancer_arn = aws_lb.test_alb.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.test_albtg.arn
  }
}

data "aws_elb_service_account" "test_elb_account" {}

output "alb_dns_name" {
  value = aws_lb.test_alb.dns_name
}

 

여기까지가 alb였고, 이제 nlb를 만들어줄 차례이다.

 

resource "aws_lb" "test_nlb" {
  name               = "test-nlb"   #nlb의 이름
  internal           = true         #내부 lb이기 때문에 true로 설정
  load_balancer_type = "network"    #lb의 타입.
  subnets            = [aws_subnet.test_priweb1.id, aws_subnet.test_priweb2.id] #nlb가 트래픽을 처리할 서브넷
}

resource "aws_lb_target_group" "test_nlbtg" {       #타겟그룹
  name        = "test-nlbtg"
  port        = 8080 #tomcat을 사용하기 때문에 8080포트를 사용한다.
  protocol    = "TCP"   #nlb의 프로토콜은 TCP, 또는 UDP를 사용한다. 
  target_type = "instance"
  vpc_id      = aws_vpc.test_vpc.id
}

resource "aws_lb_listener" "test_nlblis" {  #리스너
  load_balancer_arn = aws_lb.test_nlb.arn
  port              = "8080"
  protocol          = "TCP"

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.test_nlbtg.arn
  }
}

output "nlb_dns_name" {
  value = aws_lb.test_nlb.dns_name
}

아무래도 만드는 과정에서 제일 큰 차이는 보안그룹이 없다는 것..

 

여기까지 만들었으니 내일은 각각의 web과 was 서버에 apache와 tomcat+petclinic을 설치할 예정이다.

위의 과정들은 Ansible이 아닌 손으로 설치할 생각이다. 

손으로 설치해보는 게 손맛도 있고 재밌어서 Ansible을 통한 설치는 추후에 ㅎㅎ