테라폼 Loadbalancer 구축하기(+count)
테라폼 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.index
는 count
함수가 진행될때 순서를 지정해줍니다
count가 3일 때
count | index |
---|---|
3 | 1 |
3 | 2 |
3 | 3 |
새로운 마음으로 vpc.tf
와 variable.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이 나왔는데 공부해봐야겠네요
출처:작성중...