AWS

[테라폼] AWS ALB 어플리케이션 로드밸런싱과 HTTPS 리다이렉션

나뭇빛자루 2021. 7. 23. 11:51
반응형

사전작업 = VPC와 서브넷 그리고 EC2랑 인증서 정도 필요하다.

 

 

aws_lb는 전반적인 LB를 생성 틀을 만들어준다.

여기서 중요하게 설정할 부분은 서브넷 연결과 access_logs 정도

 

resource "aws_lb" "api" {
  name               = "api-lb-tf"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.keycut-default.id]
  subnets            = [ aws_subnet.keycut-a.id, aws_subnet.keycut-b.id ]
  enable_deletion_protection = false #이부분은 true 하면 삭제 방지가 된다.

 

/*
 access_logs {   #이부분 사용하려면 S3 만들면됨 필자는 필요없어서 주석 처리함
   bucket  = aws_s3_bucket.lb_logs.bucket
   prefix  = "test-lb"
   enabled = true
 }

*/

  tags = {
    Environment = "production"
    Name = "api_LB"
  }
}

LB에 연결될 리스너들에 대한 설정을 해주는 곳이다.

연결된 것들에 대한 포트 또 어떻게 움직일 것인가

생성되고 확인해보면 if~then 형식으로 되어 있다.
리다이랙션 부분이다 ALB니까 80으로 받은걸 443으로 보내주는것

 

resource "aws_lb_listener" "api80-lb-listener" {
  load_balancer_arn = aws_lb.api.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      host        = "#{host}"
      path        = "/#{path}"
      port        = "443"
      protocol    = "HTTPS"
      query       = "#{query}"
      status_code = "HTTP_301"
    }
  }
}

여긴 443으로 받은걸 다시 어디로 보낼것인지 설정해주는것
자기 자신에게 보내게 설정해두었다.
그리고 인증서도 여기에 기입해주면 좋다.

 

resource "aws_lb_listener" "api443-lb-listener" {
  load_balancer_arn = aws_lb.api.arn                #여기서 aws_lb api와 연결해준다.
  port              = "443"
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-2016-08"  #정책도 설정가능함
  certificate_arn   = "arn:aws:acm:us-east-2:기존에생성된인증서를넣자"

 

#그리고 기본적으로 취할 액션을 기입해준다 나는 내 자신 LB그룹에다가 포워드 해주는걸 설정
  default_action {
    target_group_arn = aws_lb_target_group.api-lb-target.arn
    type = "forward"
  }
}

#인증서 들어갈 부분이 많다면 이걸써서 변수로 받아도 상관없으나 하나라서 그냥 없어배렸음
#resource "aws_lb_listener_certificate" "example" {
#  certificate_arn = "arn:aws:acm:ap-northeast"
#  listener_arn    = aws_lb_listener.api443-lb-listener.arn
#}

여기는 어떤것들이 LB에 연결될건가 설정해 주는 단계이다.
인스턴스를 타겟이랑 포트를 어떤 것을 LB로 설정해줄 것인지 설정
resource "aws_lb_target_group" "api-lb-target" {
  name = "api-target-group"
  port = 80
  protocol = "HTTP"
  vpc_id = aws_vpc.keycut.id
  target_type = "instance"

  health_check {
    port = "traffic-port"
    protocol = "HTTP"
  }
}

위에서 LB연결 규칙을 만들었다면 밑에는 LB에 연결될 실제 인스턴스 설정
resource "aws_lb_target_group_attachment" "api-attach-cms-a" {
  target_group_arn = aws_lb_target_group.api-lb-target.arn
  target_id        = aws_instance.api-a.id
  port             = 80
}


resource "aws_lb_target_group_attachment" "api-attach-cms-b" {
  target_group_arn = aws_lb_target_group.api-lb-target.arn
  target_id        = aws_instance.api-b.id
  port             = 80
}

반응형