[Terraform을 이용하여 NCP 서버 배포] 에 이어지는 글입니다.
이전에는 테라폼을 이용하여 서버 1대를 배포했다면, 여러 대의 서버를 한 번에 배포하는 방법에 대해 알아보도록 하겠습니다.
(1편 글의 코드에 몇 가지 변형을 줄 예정입니다.)
요건
- 테라폼을 이용하여 NCP 서버 여러대 배포
환경
- 1 VPC
- 1 Public Subnet
- web server(ubuntu 20.04 , 2cpu 4GB RAM) + 1 Public IP
- was server(ubuntu 20.04 , 2cpu 4GB RAM) + 1 Public IP
- 2 Network interface
- 1 ACG(+Rule)
Process
- 테라폼을 이용한 NCP 서버 다중 배포
- 테라폼을 이용한 NCP 인프라 서비스 삭제
주의 사항
- 테라폼으로 인프라 서비스 생성 이후 콘솔상에서 변경한 내역이 있다면, 테라폼 코드에도 반영해주어야 합니다. 그렇지 않으면 정합성이 깨지게되어 테라폼을 통한 생성/수정/삭제에 영향을 미칠 수 있습니다.
========================================================================================
1. 테라폼을 이용한 NCP 서버 다중 배포
테라폼 코드를 작성할 폴더를 하나 생성합니다. 이번에는 module_2로 생성해보겠습니다.
* 테라폼 코드를 작성하기 위해 visual studio code 같은 코드 에디터를 이용하면 편리합니다.
먼저 서버를 다중으로 배포하기 위해서는 지난 번 작성한 코드에서 수정을 진행해야 합니다.
수정이 필요한 파일은 다음과 같습니다.
[수정 사항 없음]
- module_2 폴더의 바로 밑에 있는 main.tf , outputs.tf, variables.tf
- module_2/network_module 폴더 밑에 있는 outputs.tf, providers.tf, subnet.tf, vpc.tf, variables.tf
- module_2/server_module 폴더 밑에 있는 providers.tf
[수정 사항 있음]
- module_2/server_module 폴더 밑에 있는 bastion_server.tf, variables.tf
moudle_2/server_module 폴더의 variables.tf를 다음과 같이 수정합니다.
중간에 variable "server_lists"란 부분이 추가 된 것을 확인할 수 있습니다.
list 타입의 변수로 default 값으로 생성하고자 하는 서버의 이름을 차례대로 작성합니다.(작성한 이름 수만큼 서버가 생성됩니다.)
variable "region" {
default = "KR"
}
variable "zones" {
default = "KR-2"
}
variable name_terra {
default = "tmp-kbo"
}
variable "login_key_name" {
default = "kbo-login-key"
}
variable "server_lists" {
type = list(any)
description = "module 2 server name list"
default = ["web", "was"]
}
variable "vpc_no" {
description = "vpc number"
#type = number
}
variable "subnet_public_id" {
description = "public subnet id"
#type = number
}
# data filter를 사용하지 않을 경우 이미지 및 스펙 코드 명시
# variable "server_image_product_code" {
# default = "SW.VSVR.OS.LNX64.CNTOS.0708.B050"
# }
# # HDD : CPU 2 ,Memory 4GB , Disk 50GB
# variable "server_product_code" {
# default = "SVR.VSVR.HICPU.C002.M004.NET.HDD.B050.G002"
# }
이후 module_2/server_module/bastion_server.tf를 수정합니다.
count = length(var.server_lists) 문구의 경우 테라폼에서 사용하는 반복문입니다.
variables.tf에서 리스트 변수의 값으로 설정한 서버의 이름만큼 해당 구문 전체를 반복합니다.(서버 리스트에 2개의 값이 있으면 2번 반복)
또한 ${element(var.server_lists, count.index)}의 경우 반복문을 실행할 때, 리스트 변수에서 설정한 서버 이름 값을 가져옵니다.
- 반복문 첫 번째 실행 시 "web" , 두 번째 실행 시 "was"를 가져옵니다.
# Login Key
resource "ncloud_login_key" "server_login_key" {
count = length(var.server_lists)
key_name = "${var.name_terra}-${element(var.server_lists, count.index)}-svr-key"
/*Attributes Reference
ncloud_login_key.server_login_key.private_key
*/
}
resource "local_file" "ncp_pem" {
count = length(var.server_lists)
filename = "${ncloud_login_key.server_login_key[count.index].key_name}.pem"
content = ncloud_login_key.server_login_key[count.index].private_key
}
# #Init script
# resource "ncloud_init_script" "init_script_httpd_install" {
# name = "httpd-install"
# content = "#!/bin/bash\nyum -y install httpd\nsystemctl enable --now httpd\necho $HOSTNAME >> /var/www/html/index.html"
# }
#ACG
resource "ncloud_access_control_group" "acg_01" {
name = "${var.name_terra}-acg01"
description = "${var.name_terra} Access controle group"
vpc_no = var.vpc_no # ncloud_vpc.vpc.id
}
resource "ncloud_access_control_group_rule" "acg_rule_01" {
access_control_group_no = ncloud_access_control_group.acg_01.id
inbound {
protocol = "TCP"
ip_block = "221.148.114.22/32"
port_range = "22"
description = "accept 22 port"
}
inbound {
protocol = "TCP"
ip_block = "10.0.0.0/16"
port_range = "1-65535"
description = "서버 간 내부 통신"
}
outbound {
protocol = "TCP"
ip_block = "0.0.0.0/0"
port_range = "1-65535"
description = "accept TCP 1-65535 port"
}
outbound {
protocol = "UDP"
ip_block = "0.0.0.0/0"
port_range = "1-65535"
description = "accept UDP 1-65535 port"
}
outbound {
protocol = "ICMP"
ip_block = "0.0.0.0/0"
description = "accept ICMP"
}
}
#NIC
resource "ncloud_network_interface" "server_nic" {
count = length(var.server_lists)
name = "${var.name_terra}-${element(var.server_lists,count.index)}-nic"
subnet_no = var.subnet_public_id
#private_ip = var.bastion
access_control_groups = [ncloud_access_control_group.acg_01.id]
/*Attributes Reference
ncloud_network_interface.server_nic.id
*/
}
# Server - bastion server
resource "ncloud_server" "web_was_server" {
count = length(var.server_lists)
subnet_no = var.subnet_public_id
# ncloud_subnet.subnet_public.id
name = "${var.name_terra}-${element(var.server_lists,count.index)}-svr"
server_image_product_code = data.ncloud_server_image.server_image.id
server_product_code = data.ncloud_server_product.product.id
login_key_name = ncloud_login_key.server_login_key[count.index].key_name
network_interface {
network_interface_no = ncloud_network_interface.server_nic[count.index].id
order = 0
}
#VPC에서는 서버 생성 시 ACG 설정을 지원하지 않으므로 acg가 할당된 nic 연결 필요
/*Attributes Reference
ncloud_server.web_was_server.instance_no
*/
}
#Server Image Type & Product Type
data "ncloud_server_image" "server_image" {
filter {
name = "product_name"
values = ["ubuntu-20.04"]
}
/* image list
+ "SW.VSVR.OS.LNX64.CNTOS.0703.B050" = "centos-7.3-64"
+ "SW.VSVR.OS.LNX64.CNTOS.0708.B050" = "CentOS 7.8 (64-bit)"
+ "SW.VSVR.OS.LNX64.UBNTU.SVR1604.B050" = "ubuntu-16.04-64-server"
+ "SW.VSVR.OS.LNX64.UBNTU.SVR1804.B050" = "ubuntu-18.04"
+ "SW.VSVR.OS.LNX64.UBNTU.SVR2004.B050" = "ubuntu-20.04"
+ "SW.VSVR.OS.WND64.WND.SVR2016EN.B100" = "Windows Server 2016 (64-bit) English Edition"
+ "SW.VSVR.OS.WND64.WND.SVR2019EN.B100" = "Windows Server 2019 (64-bit) English Edition"
*/
/* Attributes Reference
data.ncloud_server_image.server_image.id
*/
}
data "ncloud_server_product" "product" {
server_image_product_code = data.ncloud_server_image.server_image.id
filter {
name = "product_code"
values = ["SSD"]
regex = true
}
filter {
name = "cpu_count"
values = ["2"]
}
filter {
name = "memory_size"
values = ["4GB"]
}
filter {
name = "product_type"
values = ["HICPU"]
/* Server Spec Type
STAND
HICPU
HIMEM
*/
}
/* Attributes Reference
data.ncloud_server_product.product.id
*/
}
# Export Root Password
data "ncloud_root_password" "default" {
count = length(var.server_lists)
server_instance_no = ncloud_server.web_was_server[count.index].instance_no # ${ncloud_server.vm.id}
private_key = ncloud_login_key.server_login_key[count.index].private_key # ${ncloud_login_key.key.private_key}
/*Attributes Reference
ncloud_root_password.default.root_password
*/
}
resource "local_file" "svr_root_pw" {
count = length(var.server_lists)
filename = "${ncloud_server.web_was_server[count.index].name}_root_password.txt"
content = "${ncloud_server.web_was_server[count.index].name} => ${data.ncloud_root_password.default[count.index].root_password}"
}
# Public IP
resource "ncloud_public_ip" "public_ip" {
count = length(var.server_lists)
server_instance_no = ncloud_server.web_was_server[count.index].id
description = "for ${ncloud_server.web_was_server[count.index].name} public ip"
}
수정 이후 terraform init -> terraform plan -> terraform apply를 통해 작성한 tf 파일로 ncp 인프라 리소스를 생성합니다.
*2023.06.13 추가
The terraform-provider-ncloud_v2.2.9 plugin crashed! 이슈 방지를 위해
terraform init -upgrade 명령어로 프로바이더를 업그레이드 합니다.
Step 1. Terraform init
Step 2. Terraform plan
Step 3. terraform apply
정상적으로 잘 실행되었다면 아래와 같이 서버가 2대 생성된 것을 확인할 수 있습니다.
2. 테라폼을 이용한 NCP 인프라 서비스 삭제
테라폼 코드를 통해 배포한 인프라 서비스를 삭제하기 위해 코드를 실행한 폴더에서 terraform destroy 명령어를 입력합니다.
terraform destroy
yes
삭제는 인프라간 의존성에 맞추어 마지막 리소스부터 삭제되며 이상이 없다면 정상적으로 삭제된 것을 확인할 수 있습니다.
'Terraform' 카테고리의 다른 글
Terraform을 이용하여 NCP 서버 배포 (0) | 2022.08.05 |
---|