클라우드/AWS-Terraform

network 모듈 구현

Hoony.Song 2023. 10. 23. 20:54
반응형

network 모듈 기능

aws 에 로드밸런서를 구현하고 호스트에 라우팅 하기 위한 기능입니다
nlb alb 를 사용하기 위해 구성 하였습니다
각각의 기능을 분리 한 이유는 gitlab 인스턴스의 네트워크 구조 때문입니다
ssh clone 기능을 사용 하기 위해 새로운 ssh용 호스트를 구성하는 대신
하나의 호스트로 로드 밸런서를 통해 ssh 와 alb 를 나눠 사용 하기 위함 입니다
alb의 단일 구성이나 각각의 기능을 구성하고 연결 할 수 있도록 만들었습니다
 

network 모듈 alb

  • 이 모듈은 간편하게 alb를 구성하기 위한 모듈 입니다
  • alb 모듈 안에서 로드밸런서 타겟그룹 리스너 를 전부 생성하여 간편하게 사용 가능합니다

 

alb 모듈

resource "aws_alb" "alb" {
  name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
  internal = false
  load_balancer_type = "application"
  security_groups = ["${var.security_group_id}"]
  subnets = var.public_subnets[*].id
  
  tags = merge(var.default_tags,{
    Name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
  })
  enable_cross_zone_load_balancing = true

  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_alb_target_group" "alb_group" {
    name    = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
    port     = 80
    protocol = "HTTP"
    vpc_id   = var.vpc_id

    health_check {
    //enabled             = true
    healthy_threshold   = 3
    interval            = 30
    unhealthy_threshold = 3
    //matcher             = "200" 
    path                = "/"
    //port                = "traffic-port"
    //protocol            = "HTTP"
  }
  tags = merge(var.default_tags,{
    Name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
  })
}
 data "aws_acm_certificate" "tebedev_com"   { 
   domain   = var.certificate_domain
   statuses = ["ISSUED"]
 }

resource "aws_alb_listener" "HTTPS" {
  load_balancer_arn = "${aws_alb.alb.arn}"
  port              = "443"
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-TLS13-1-2-2021-06"
  certificate_arn   = "${data.aws_acm_certificate.tebedev_com.arn}"
  default_action {
    target_group_arn = "${aws_alb_target_group.alb_group.arn}"
    type             = "forward"
  }
}

resource "aws_alb_listener" "http" {
  load_balancer_arn = "${aws_alb.alb.arn}"
  port              = "80"
  protocol          = "HTTP"

  default_action {
    target_group_arn = "${aws_alb_target_group.alb_group.arn}"
    type             = "forward"
  }
}

resource "aws_alb_target_group_attachment" "alb_attach" {
  target_group_arn = aws_alb_target_group.alb_group.arn
  target_id = "${var.instance_id}"
  port = 80
}
  • 이 모듈은 alb 기본 생성시 80번 포트와 443 포트의 리스너가 기본 생성 됩니다
  • 일반적인 alb 구성으로 사용 가능 합니다
  • 생성 예 >
    • module "nexus_alb" {
        source             = "../../../../modules/network/alb"
        name = "nexus_alb"
        vpc_id = data.terraform_remote_state.resources.outputs.vpc_id
        public_subnets = data.terraform_remote_state.resources.outputs.pub_subnets
        security_group_id = data.terraform_remote_state.resources.outputs.security_group1_all_id
        instance_id = module.ec2-nexus.instance_id
        instance_name = local.instance_name
      }

 

network 모듈 loadbalancer

  • 로드밸런서, 타겟그룹, 리스너, 리스너룰 등 각각의 기능을 분할 하여 좀더 유연한 네트워크 구조를 설계 가능 하도록 하였습니다

 

lb 모듈

resource "aws_lb" "lb" {
  name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
  internal = false
  load_balancer_type = var.load_balancer_type
  security_groups = ["${var.security_group_id}"]
  subnets = var.public_subnets[*].id
  
  tags = merge(var.default_tags,{
    Name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
  })
  enable_cross_zone_load_balancing = true

  lifecycle {
    create_before_destroy = true
  }
}
  • 이 모듈은 로드밸런서 생성 모듈로 로드밸런서 타입을 지정 할 수 있습니다
    • application
    • network
  • 생성 예 >
    • locals {  
        ssh_port = 22
        HTTP_port = 80
        HTTPS_port = 443 
        target_type_inst = "instance"
        target_type_alb = "alb"
        load_balancer_type_net = "network"
        load_balancer_type_app = "application"
        protocol_tcp = "TCP"
        protocol_http = "HTTP"
        protocol_https = "HTTPS"
      
      }
       module "alb-gitlab" {
        source             = "../../../../modules/network/loadbalancer/elb"
        name = "alb-gitlab"
        load_balancer_type = local.load_balancer_type_app
        security_group_id = data.terraform_remote_state.resources.outputs.security_group_id_all
        public_subnets = data.terraform_remote_state.resources.outputs.pub_subnets  
      }

 

listener 모듈 (443port)

  • 리스너는 로드 밸런서에 대한 클라이언트 연결 요청을 청취하고, 정의된 라우팅 규칙에 따라 해당 요청을 특정 타깃으로 전달하는 역할을 합니다
resource "aws_alb_listener" "ssl_listener" {
  count             = var.ssl_attach ? 1 : 0
  load_balancer_arn = var.load_balancer_arn
  port              = var.port
  protocol          = var.protocol
  ssl_policy      = var.ssl_policy
  certificate_arn = data.aws_acm_certificate.tebedev_com.arn

  default_action {
    target_group_arn = var.target_group_arn
    type             = var.target_type
  }  
}
  • 이 모듈은 리스너를 생성 하는 모듈 입니다
  • count = var.ssl_attach ? 1 : 0 ssl_attach 가 true 면 동작 합니다 (443 포트)
  • 예 >
    • module "listener-alb-https"{
        source             = "../../../../modules/network/loadbalancer/listener"
        port = local.HTTPS_port
        protocol = local.protocol_https
        ssl_attach = true
        target_group_arn = module.tg-gitlab.arn
        load_balancer_arn = module.alb-gitlab.arn  
        certificate_domain = var.certificate_domain
      }

 

listener 모듈 (80 , 22, 8080 port )

resource "aws_alb_listener" "listener" {
  count             = var.ssl_attach ? 0 : 1
  load_balancer_arn = var.load_balancer_arn
  port              = var.port
  protocol          = var.protocol
  default_action {
    target_group_arn = var.target_group_arn
    type             = var.target_type
  }  
}
  • count = var.ssl_attach ? 1 : 0 ssl_attach 가 false 면 동작 합니다 (443 외 포트들)
  • 예 >
    • module "listener-alb-http"{
        source             = "../../../../modules/network/loadbalancer/listener"
        port = local.HTTP_port
        protocol = local.protocol_http
        ssl_attach = false
        target_group_arn = module.tg-gitlab.arn
        load_balancer_arn = module.alb-gitlab.arn  
        certificate_domain = var.certificate_domain
      }

 

listener rule 모듈

  • 리스너 룰은 특정 패턴에 매치되는 들어오는 요청을 특정 타깃 그룹으로 라우팅하는 역할을 합니다
resource "aws_lb_listener_rule" "redirect_http_to_https" {
  listener_arn = var.listener_arn
  priority = var.priority
  action {
    type = var.rule_type

    redirect {
      port        = var.redirect_port
      protocol    = var.redirect_protocol
      status_code = var.redirect_state_code
    }
  }

  condition {
    path_pattern {
      values           = ["${var.redirect_pattern_path}"]
    }
  }
}
  • 이 모듈은 특정 경로를 통해 들어오는 요청을 처리하기 위해 만들었습니다
  • 80번 포트로 들어 오는 요청을 443 포트로 redirect 합니다
  • 예 >
    • module "listener_rule" {
        source = "../../../../modules/network/loadbalancer/listener_rule"
        listener_arn = module.listener-alb-https.listener_arn
        redirect_port = local.HTTP_port
        redirect_pattern_path = var.certificate_domain
        priority = "1"  
      }

 

target_group 모듈

  • 타겟 그룹은 ALB 또는 NLB에 의해 라우팅되는 요청을 처리할 수 있는 리소스(일반적으로 EC2 인스턴스, IP 주소, AWS Lambda 함수 등)의 집합을 가리킵니다
resource "aws_lb_target_group" "lb_group" {
    name    = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
    target_type = var.target_type
    port     = var.port
    protocol = var.protocol
    vpc_id   = var.vpc_id

    health_check {
    //enabled             = true
    healthy_threshold   = 3
    interval            = 30
    unhealthy_threshold = 3
    //matcher             = "200" 
    path                = "/"
    //port                = "traffic-port"
    //protocol            = "HTTP"
  }
  tags = merge(var.default_tags,{
    Name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
  })
}
  • 예 >
    • module "tg-gitlab" {
        source             = "../../../../modules/network/loadbalancer/targetgroup"
        name = "tg-gitlab"
        target_type = local.target_type_inst
        port = local.HTTP_port
        vpc_id = data.terraform_remote_state.resources.outputs.vpc_id
        protocol =  local.protocol_http
      }

 

attach 모듈

  • 타겟그룹과 인스턴스를 연결하는 역할을 합니다
resource "aws_alb_target_group_attachment" "alb_attach" {
  target_group_arn = var.target_group_arn
  target_id = var.instance_id
  port = var.port
}
  • 예 >
    • module "gitlab-http-attach" {
        source             = "../../../../modules/network/loadbalancer/attach"
        target_group_arn = module.tg-gitlab.arn
        instance_id =  module.ec2-gitlab.instance_id
        port = local.HTTP_port
      }
반응형

'클라우드 > AWS-Terraform' 카테고리의 다른 글

ETC 모듈 구현  (0) 2023.10.23
iam 모듈 구현  (0) 2023.10.23
compute 모듈 구현  (0) 2023.10.23
terraform 설치  (0) 2023.10.23
terraform 배포 전략  (0) 2023.10.23