Study/NCP

[NCP] Terraform으로 KVM 서버를 만들어보자 - Code

Dream Amal 2024. 10. 31.
 

[NCP] Terraform : ncloud version 3.2.0 업데이트

지난주 (20241018) 기준 Terraform 의 ncloud 버전이 업데이트 되었습니다. 업데이트 내역에서 가장 중요한 부분은 KVM 하이퍼바이저를 지원한다는 것이 될 것 같습니다. 기존에 Terraform으로 server를 생

dream-coding.tistory.com

 

 

지난번 작성했던 글처럼, 이제는 Terraform 으로도 KVM 서버 및 NKS 생성이 가능해졌다.

이번 글에서는 간단하게 bastion 서버를 Terraform으로 만드는 code를 공유하고자 한다.

실제로 현재 나는 Hypervisor의 제약 없이 Server, NKS 등의 자원을 IaC로 생성하고 있는데, 확실히.. 편하다..

provider.tf

terraform {
  required_providers {
    ncloud = {
      source = "NaverCloudPlatform/ncloud"
      version = ">= 2.3.19"
    }
  }
}

provider "ncloud" {
  region      = var.region
  site           = var.site
  support_vpc = "true"
  access_key  = var.ncloud_access_key
  secret_key  = var.ncloud_secret_key
}

vpc.tf

# VPC 설정
resource "ncloud_vpc" "vpc" {
  name            = "${var.service_name}-vpc"
  ipv4_cidr_block = var.vpc_cidr
}

# 서브넷 설정
## 이번 포스팅에서는 bastion server를 생성하는 것이기 때문에, public subnet 1개만 생성함
resource "ncloud_subnet" "pub_dmz_subnet" {
  vpc_no         = ncloud_vpc.vpc.id
  subnet         = var.pub_dmz_subnet_cidr
  zone           = var.zone
  network_acl_no = ncloud_vpc.vpc.default_network_acl_no
  subnet_type    = "PUBLIC"
  name           = "${var.service_name}-pub-dmz-sub"
  usage_type     = "GEN"
}

security.tf

# PEM키 생성
resource "ncloud_login_key" "loginkey" {
  key_name  = "${var.service_name}"
}

resource "local_file" "ssh_key" {
  filename  = "./${ncloud_login_key.loginkey.key_name}.pem"
  content   = ncloud_login_key.loginkey.private_key
}

server.tf

# Bastion 서버 설정

# bastion server spec
data "ncloud_server_image_numbers" "kvm-image" {
  server_image_name = "ubuntu-22.04-base"   # 원하는 image 이름으로 변경 가능
  filter {
    name = "hypervisor_type"
    values = ["KVM"]
  }
}

data "ncloud_server_specs" "kvm-spec" {
  filter {
    name   = "server_spec_code"
    values = ["c2-g3"]      # 2core 4mem
  }
}

## 사용하는 init script가 있다면 해당 부분 주석 해제하여 사용
# resource "ncloud_init_script" "init_script" {
#   name      = "${var.service_name}-init-script"
#   content   = file(var.bastion_init_script_path) 
# }

resource "ncloud_server" "bastion" {
  name                          = "${var.service_name}-bastion"
  subnet_no                     = ncloud_subnet.pub_dmz_subnet.id
  zone                          = var.zone
  login_key_name                = ncloud_login_key.loginkey.key_name
  is_protect_server_termination = false
  server_image_number           = data.ncloud_server_image_numbers.kvm-image.image_number_list.0.server_image_number
  server_spec_code              = data.ncloud_server_specs.kvm-spec.server_spec_list.0.server_spec_code
  # init_script_no                = ncloud_init_script.init_script.id
}

resource "ncloud_public_ip" "pub_ip" {
  server_instance_no   = ncloud_server.bastion.id
}

variables.tf

variable "ncloud_access_key" {
  description = "Naver Cloud Platform Access Key"
  type        = string
  sensitive   = true  # 민감 정보로 표시
}

variable "ncloud_secret_key" {
  description = "Naver Cloud Platform Secret Key"
  type        = string
  sensitive   = true  # 민감 정보로 표시
}

variable "region" {
  description = "Region to deploy resources in Ncloud"
  type        = string
  default     = "KR"  # 기본값을 설정했지만 필요에 따라 변경 가능
}

variable "site" {
  description = "Ncloud Site"
  type        = string
  default     = "public"  # 민간존(public) | 공공존(gov) | 금융존(fin)
}

variable "zone" {
  description = "Availability zone"
  type        = string
  default     = "KR-1"
}

variable "service_name" {
  description = "The name of the service for naming the resources"
  type        = string
}

variable "vpc_cidr" {
  description = "CIDR block for the VPC"
  type        = string
}

# 서브넷의 CIDR을 변수로 정의
variable "pub_dmz_subnet_cidr" {
  description = "CIDR block for the public DMZ subnet"
  type        = string
}

## 사용하는 init script가 있다면 해당 부분 주석 해제하여 사용
# variable "bastion_init_script_path" {
#   description = "Path to the local init script file"
#   type        = string
# }

terraform.tfvars

# IAM 설정
ncloud_access_key = "<개인 access key 값 입력>"
ncloud_secret_key = "<개인 secret key 값 입력>"
site = "public"

# service 이름 설정
service_name = "tf-test"

# VPC 및 Subnet 설정
vpc_cidr     = "10.0.0.0/16"
pub_dmz_subnet_cidr = "10.0.1.0/24"

# bastion 서버 설정
## init script path 설정
# bastion_init_script_path = "./sh/ubuntu-init.sh"
728x90

댓글