네이버클라우드플랫폼(Ncloud)/테라폼

테라폼 Loadbalancer 구축하기(+count)

bo20cy 2024. 1. 29. 12:18

테라폼 Loadbalancer 구축하기

테라폼 lb 생성 방법

 

resource "ncloud_lb" "test" {
  name = "tf-lb-test"
  network_type = "PUBLIC"
  type = "APPLICATION"
  subnet_no_list = [ ncloud_subnet.test.subnet_no ]
}

 

lb생성

resource "ncloud_lb_target_group" "test" {
  vpc_no   = ncloud_vpc.test.vpc_no
  protocol = "HTTP"
  target_type = "VSVR"
  port        = 8080
  description = "for test"
  health_check {
    protocol = "HTTP"
    http_method = "GET"
    port           = 8080
    url_path       = "/monitor/l7check"
    cycle          = 30
    up_threshold   = 2
    down_threshold = 2
  }
  algorithm_type = "RR"
}

 

타겟그룹 생성

resource "ncloud_lb_listener" "test" {
  load_balancer_no = ncloud_lb.test.load_balancer_no
  protocol = "HTTP"
  port = 80
  target_group_no = ncloud_lb_target_group.test.target_group_no
}

 

로드밸런서 리스너 규칙

resource "ncloud_lb_target_group_attachment" "test" {
  target_group_no = ncloud_lb_target_group.test.target_group_no
  target_no_list = [ncloud_server.test.instance_no]
}

 

타겟그룹에 리스너 붙이기

공식 문서

https://registry.terraform.io/providers/NaverCloudPlatform/ncloud/latest/docs/resources/lb

 

Terraform Registry

 

registry.terraform.io



추가된 함수 count

count = length(var.server_pri_CIDR)
count는 반복문 으로 사용되어
length(var.server_pri_CIDR) 의 값을 읽고
1개가 적혀있으면 1번 만들고
2개가 적혀있으면 2번 만들게 해줍니다.
이러면 variable.tf만 관리를 하면 자동으로 나머지 값이 정렬되는 효과를 가져옵니다.

 

-count.indexcount함수가 진행될때 순서를 지정해줍니다

 

count가 3일 때

count index
3 1
3 2
3 3

 





새로운 마음으로 vpc.tfvariable.tf를 분리했습니다.

variable.tf

#variable.tf
// VPC 이름
variable "pnoun" {
  type = string
  default = "bo20cy"
}
// VPC CIDR
variable "vpc_cidr_block" {
  type = string
  default = "10.2.0.0/16"
}
// Subnet을 생성할 Zone 선택(ex:KR-1,KR-2...)
variable "zone" {
  type = string
  default="KR-2"
}
// Subnet_pub 사용 대역
variable "subnet_pub_CIDR" {
  type = list
  default= ["10.2.11.0/24", "10.2.12.0/24"]
}
// Subnet_pri 사용 대역
variable "subnet_pri_CIDR" {
  type = list
  default= ["10.2.21.0/24", "10.2.22.0/24"]
}
// Subnet_db 사용 대역
variable "subnet_db_CIDR" {
  type = list
  default= ["10.2.31.0/24", "10.2.32.0/24"]
}
// Subnet_db 사용 대역
variable "subnet_lb_CIDR" {
  type = list
  default= ["10.2.41.0/24"]
}
// Server_pub_ip 사용 대역
variable "server_pub_CIDR" {
  type = list
  default= ["10.2.11.6", "10.2.12.7"]
}
// Server_pri_ip 사용 대역
variable "server_pri_CIDR" {
  type = list
  default= ["10.2.21.6", "10.2.22.7"]
}
// Server_db_ip 사용 대역
variable "server_db_CIDR" {
  type = list
  default= ["10.2.31.6", "10.2.32.7"]
}
// Server_db_ip 사용 대역
variable "server_lb_CIDR" {
  type = list
  default= ["10.2.41.6" ]
}
// NATGW 여부
variable "natgw_chk" {
  type = bool
  default = false
}
// Route table ID
variable "route_table_no" {
  type = string
  default = ""
}

 

여러가지가 추가 되었지만 그냥 숫자자체만 늘어났습니다.

 

 

 

vpc.tf

 

// 키 이름
resource "ncloud_login_key" "create_key" {
  key_name = "${var.pnoun}-key-2"
}
resource "local_file" "ncp_pem" {
  filename = "${var.pnoun}-2.pem"
  content = ncloud_login_key.create_key.private_key
}
// VPC 생성
resource "ncloud_vpc" "create_vpc" {
    name = "${var.pnoun}--vpc"
    ipv4_cidr_block = var.vpc_cidr_block
}
// NACL 생성
resource "ncloud_network_acl" "create_nacl" {
   vpc_no      = ncloud_vpc.create_vpc.id
   name        = "${var.pnoun}-nacl"
   description = "${var.pnoun}용 nacl"
 }
// Subnet 생성
resource "ncloud_subnet" "create_pub_subnet" {
    count = length(var.subnet_pub_CIDR)
  vpc_no = ncloud_vpc.create_vpc.id
  subnet = "${var.subnet_pub_CIDR[count.index]}"
  zone = var.zone
  network_acl_no = ncloud_network_acl.create_nacl.network_acl_no
  subnet_type = "PUBLIC"  // PUBLIC(Public) | PRIVATE(Private)
  name = "${var.pnoun}-pub-sub-${count.index+1}"
  usage_type = "GEN"
}
resource "ncloud_subnet" "create_pri_subnet" {
    count = length(var.subnet_pri_CIDR)
  vpc_no = ncloud_vpc.create_vpc.id
  subnet = "${var.subnet_pri_CIDR[count.index]}"
  zone = var.zone
  network_acl_no = ncloud_network_acl.create_nacl.network_acl_no
  subnet_type = "PRIVATE"
// PUBLIC(Public) | PRIVATE(Private)
  name = "${var.pnoun}-pri-sub-${count.index+1}"
  usage_type = "GEN"
}
resource "ncloud_subnet" "create_db_subnet" {
    count = length(var.subnet_db_CIDR)
  vpc_no = ncloud_vpc.create_vpc.id
  subnet = "${var.subnet_db_CIDR[count.index]}"
  zone = var.zone
  network_acl_no = ncloud_network_acl.create_nacl.network_acl_no
  subnet_type = "PRIVATE"
// PUBLIC(Public) | PRIVATE(Private)
  name = "${var.pnoun}-db-sub-${count.index+1}"
  usage_type = "GEN"
}
resource "ncloud_subnet" "create_lb_subnet" {
  vpc_no         = ncloud_vpc.create_vpc.id
  subnet         = var.subnet_lb_CIDR[0]
  zone           = var.zone
  network_acl_no = ncloud_network_acl.create_nacl.network_acl_no
  subnet_type    = "PUBLIC" // PUBLIC(Public) | PRIVATE(Private)
  // below fields is optional
  name           = "${var.pnoun}-pub-sub-lb"
  usage_type     = "LOADB"    // GEN(General) | LOADB(For load balancer)
}

 

 

맨 먼저 키를 다운받기 위한 명령어를 넣었습니다.
하다가 막히면 SSH로 접근하여 확인하시면 됩니다.
web-was-db 생성을 위해 pub-pri-pri로 구성하였습니다. pri-pri-pri 구성 되나 공부를 위해 pub하나 넣었습니다.
그리고 로드밸런서 넣기위해서는 로드밸런스용 서브넷과 CIDR값이 필요합니다

 

 

SERVER_LB.TF


#private server nic                        #안하면 acg안붙음
resource "ncloud_network_interface" "create_nic_pri" {
  count                       = length(var.server_pri_CIDR)
  name                  = "${var.pnoun}-pri-nic-${count.index+1}"
  subnet_no             = ncloud_subnet.create_pri_subnet[count.index].id
  private_ip            = "${var.server_pri_CIDR[count.index]}"
  access_control_groups = [ncloud_vpc.create_vpc.default_access_control_group_no]
}
#private server
resource "ncloud_server" "create_pri_sv" {
 count                      = length(var.server_pri_CIDR)
  subnet_no                 =  ncloud_subnet.create_pri_subnet[count.index].id
  name                      = "${var.pnoun}-pri-sv-${count.index+1}"
   server_image_product_code = "SW.VSVR.OS.LNX64.CNTOS.0703.B050"
  description               = "${var.pnoun}-pri-sv-${count.index+1} is best tip!!"
  login_key_name            = ncloud_login_key.create_key.key_name
  network_interface   {
    network_interface_no = ncloud_network_interface.create_nic_pri[count.index].id
    order = 0
  }
}

#pub nic
resource "ncloud_network_interface" "create_nic_pub" {
  count                       = length(var.server_pub_CIDR)
  name                  = "${var.pnoun}-pub-nic-${count.index+1}"
  subnet_no             = ncloud_subnet.create_pub_subnet[count.index].id
  access_control_groups = [ncloud_vpc.create_vpc.default_access_control_group_no]
}
#public server
resource "ncloud_server" "create_pub_sv" {
 count                     = length(var.server_pub_CIDR)
  subnet_no                =  ncloud_subnet.create_pub_subnet[count.index].id
  name                     = "${var.pnoun}-pub-sv-${count.index+1}"
   server_image_product_code = "SW.VSVR.OS.LNX64.CNTOS.0703.B050"
  description              = "${var.pnoun}-pub-sv-${count.index+1} is best tip!!"
  login_key_name           = ncloud_login_key.create_key.key_name
# init_script_no = "${ncloud_init_script.create_init.id}"
  network_interface   {
    network_interface_no = ncloud_network_interface.create_nic_pub[count.index].id
    order = 0
  }
}
#db server nic                        #안하면 acg안붙음
resource "ncloud_network_interface" "create_nic_db" {
  count                       = length(var.server_db_CIDR)
  name                  = "${var.pnoun}-db-nic-${count.index+1}"
  subnet_no             = ncloud_subnet.create_db_subnet[count.index].id
  private_ip            = "${var.server_db_CIDR[count.index]}"
  access_control_groups = [ncloud_vpc.create_vpc.default_access_control_group_no]
}
#db server
resource "ncloud_server" "create_db_sv" {
 count                       = length(var.server_db_CIDR)
  subnet_no                 =  ncloud_subnet.create_db_subnet[count.index].id
  name                      = "${var.pnoun}-db-sv-${count.index+1}"
  server_image_product_code = "SW.VSVR.OS.LNX64.CNTOS.0703.B050"
  description                 = "${var.pnoun}-db-sv-${count.index+1} is best tip!!"
  login_key_name            = ncloud_login_key.create_key.key_name
  network_interface   {
    network_interface_no = ncloud_network_interface.create_nic_db[count.index].id
    order = 0
  }
}



#퍼블릿 ip
resource "ncloud_public_ip" "public-ip" {
  count                 =length(var.subnet_pub_CIDR)
  server_instance_no = ncloud_server.create_pub_sv[count.index].id
}
data "ncloud_root_password" "root_passwd_pub" {
  count                       = length(var.subnet_pri_CIDR)
  server_instance_no = ncloud_server.create_pub_sv[count.index].id
  private_key        = ncloud_login_key.create_key.private_key
}
data "ncloud_root_password" "root_passwd_pri" {
  count                       = length(var.subnet_pri_CIDR)
  server_instance_no = ncloud_server.create_pri_sv[count.index].id
  private_key        = ncloud_login_key.create_key.private_key
}
data "ncloud_root_password" "root_passwd_db" {
  count                       = length(var.subnet_db_CIDR)
  server_instance_no = ncloud_server.create_db_sv[count.index].id
  private_key        = ncloud_login_key.create_key.private_key
}


#LB Targetgroup
resource "ncloud_lb_target_group" "create_lb_tg" {
  name = "${var.pnoun}-lb-tag-web"
  vpc_no   = ncloud_vpc.create_vpc.id
  protocol = "HTTP"
  target_type = "VSVR"
  port        = 80
  description = "${var.pnoun}-lb-tag-web"
  health_check {
    protocol = "HTTP"
    http_method = "GET"
    port           = 80
    url_path       = "/"
    cycle          = 30
    up_threshold   = 2
    down_threshold = 2
  }
  algorithm_type = "RR"
}

#LB targetgorup attachment
resource "ncloud_lb_target_group_attachment" "create_lb_tg_att" {
  target_group_no = ncloud_lb_target_group.create_lb_tg.id
  target_no_list = [ncloud_server.create_pub_sv[0].id, ncloud_server.create_pub_sv[1].id]
}
#LB
resource "ncloud_lb" "create_lb" {
  name  =  "${var.pnoun}-lb-web"
  network_type = "PUBLIC"
  type = "APPLICATION"
  subnet_no_list = [ncloud_subnet.create_lb_subnet.id]
}

resource "ncloud_lb_listener" "listener" {
  load_balancer_no = ncloud_lb.create_lb.id
  protocol = "HTTP"
  port = 80
  target_group_no = ncloud_lb_target_group.create_lb_tg.id
}

 

서버를 서브넷 마다 넣었고 서버IP값을 읽어 서버를 생성했습니다.
로드샐런서도 위에 예시를 넣어 만들고 자동으로 붙게했습니다.
서버가 많아지니 비밀번호 확인차 데이터를 넣었습니다.
네이버클라우드는 공인IP를 나중에 붙이는 방식으로 PUB서브넷이여도 안 붙이면 PRI으로 유지할 수 있습니다.

 

 

OUTPUT.TF

 

#output.tf
output "server_public_ip" {
  value       = ncloud_public_ip.public-ip.*.public_ip
  description = "The public IP of the Instance"
}
output "subnet_public_private_ip" {
  value       = ncloud_network_interface.create_nic_pub.*.private_ip
  description = "The private IP of the Instance"
}
output "loadbalancer_public_dns" {
  value       = ncloud_lb.create_lb.domain
  description = "The lb DNS of the Instance"
}

 

 

아웃풋에는 넣고 싶으것 찾으셔서 넣으시면 되지만 저는 새로 만든 걸 찾기 쉽게 PUB서버 IP들과 로드밸런서 DNS를 넣어 바로 확인 가능하게 했습니다.

 

 

apply 적용 끝~

 

 

 

 

navercloudplatform terraform3.0.0이 나왔습니다.
새로운 내용으로 mysql이 나왔는데 공부해봐야겠네요

 

 

 

 

출처:작성중...