Dev./Terraform

Terrform: NCP 서버 생성

Ivan'show 2023. 9. 2.
728x90
반응형

Infra/main.tf 에 NCP 를 위한 provider 셋팅

Beginning point

terraform doc 에서 Ncloud 와 관련한 문서찾기

init: Customizing configuration

NaverClould provider 셋팅 가져와서 설정값 커스터마이징

# main.tf
terraform {
  required_providers {
    ncloud = {
      source = "NaverCloudPlatform/ncloud"
    }
  }
  required_version = ">= 0.13"
}

// Configure the ncloud provider
provider "ncloud" {
#   access_key  = var.access_key
#   secret_key  = var.secret_key
  region      = var.region
#   site        = var.site
#   support_vpc = var.support_vpc
}

// Create a new server instance
resource "ncloud_server" "server" {
  # ...
}
# configuration set up
terraform init

Server instance code

VPC setup

VPC 로 진행할 예정이니 아래에 있는 VPC 버전으로 셋팅

terraform {
  required_providers {
    ncloud = {
      source = "NaverCloudPlatform/ncloud"
    }
  }
  required_version = ">= 0.13"
}

// Configure the ncloud provider
provider "ncloud" {
#   access_key  = var.access_key
#   secret_key  = var.secret_key
  region      = "KR"
  site        = "PUBLIC"
  support_vpc = true
}

// Create a new server instance
resource "ncloud_login_key" "loginkey" {
  key_name = "test-key"
}

resource "ncloud_vpc" "test" {
  ipv4_cidr_block = "10.1.0.0/16"
}

resource "ncloud_subnet" "test" {
  vpc_no         = ncloud_vpc.test.vpc_no
  subnet         = cidrsubnet(ncloud_vpc.test.ipv4_cidr_block, 8, 1)
  zone           = "KR-2"
  network_acl_no = ncloud_vpc.test.default_network_acl_no
  subnet_type    = "PUBLIC"
  usage_type     = "GEN"
}

resource "ncloud_server" "server" {
  subnet_no                 = ncloud_subnet.test.id
  name                      = "my-tf-server"
  server_image_product_code = "SW.VSVR.OS.LNX64.CNTOS.0703.B050"
  login_key_name            = ncloud_login_key.loginkey.key_name
}

plan 과 apply 를 진행하게되면 이번에는 NCP 통해 서버를 띄우기 떄문에 access key 와 secret key 를 입력하라고 요청이 온다. NCP 웹사이트 → 계정관리 → 인증키 관리 에서 찾아서 입력하면 된다.

terraform plan
terraform apply

Key handling

필요할 떄마다 계속해서 복사 붙여넣기 하기 힘들기 때문에 zsh 에 삽입해주는 것도 방법이다.

vi ~/.zshrc
# 값 추가해 놓기
export NCLOUD_ACCESS_KEY=""
export NCLOUD_SECRET_KEY=""
export NCLOUD_REGION="KR"

# 이후 쉘에서 source
source ~/.zshrc

Result check

완료가 되었으면 생성된 부분을 NCP 에서 확인이 가능하다.

 

이제 다시 삭제해보자

terraform destroy

위에서 zshrc 에 등록해서 소싱을 해두었다면 따로 access key 와 secret key 를 입력하라고 뜨지 않을 것이다.

삭제완료

Update code

NCP 서버 생성에 디테일을 잡아주자.

기본적으로 테라폼은 API 를 기반으로 운용되기 때문에 각각의 서비스들에서 제공하는 문서들을 참고하여 필드를 사용하는 것이 바람직하다.

<https://api.ncloud-docs.com/docs/home>

Instance detail

원하는 클라우드 환경과 원하는 인스턴스를 설정한다.

<https://api.ncloud-docs.com/docs/common-vapidatatype-clouddbproduct>

네이버 클라우드 API 문서에서 제공하는 필드 네임들을 체크하고 코드에 적용한다.

resource "ncloud_server" "server" {
  subnet_no                 = ncloud_subnet.test.id
  name                      = "my-tf-server"
#   server_image_product_code = "SW.VSVR.OS.LNX64.CNTOS.0703.B050"
  server_image_product_code =  "SW.VSVR.OS.LNX64.UBNTU.SVR2004.B050"
  server_product_code       = data.ncloud_server_products.products.server_products[0].product_code # 서버스펙 설정
  login_key_name            = ncloud_login_key.loginkey.key_name
  ...
}

# 서버스펙 데이터 삽입
data "ncloud_server_products" "products" {
  server_image_product_code = "SW.VSVR.OS.LNX64.UBNTU.SVR2004.B050"
  # SVR.VSVR.HICPU.C002.M004.NET.HDD.B050.G002

  filter {
    name   = "product_code"
    values = ["SSD"]
    regex  = true
  }

  filter {
    name   = "cpu_count"
    values = ["2"]
  }

  filter {
    name   = "memory_size"
    values = ["4GB"]
  }

  filter {
    name   = "base_block_storage_size"
    values = ["50GB"]
  }

  filter {
    name   = "product_type"
    values = ["HICPU"]
  }

  output_file = "product.json"
}

output "products" {
  value = {
    for product in data.ncloud_server_products.products.server_products:
    product.id => product.product_name
  }
}

filter 된 내용과 일치하는 정보값으로 product code (server sepcs) 가 들어가게 된다.

Public IP set up

기존 코드로는 ip 설정이 되지 않아 ssh 로 접근이 어렵다. 이부분을 설정하고 할당하자.

Server resource 에 기본적으로 들어가 있는 필드들을 알고 있어야 작성하는데 이해가 안가는 부분을 줄일 수 있다.

공인 IP 를 생성해주고 server_instance_no 를 이용해서 할당해준다.

# 공인 IP 설정 및 부여
resource "ncloud_public_ip" "test" { # 빈 깡통으로 넣어주기만 해도 공인 IP는 생성
    server_instance_no = ncloud_server.server.instance_no
}

그러나 resource 를 이용해 사용되는 리소스를 생성하기는 하지만 가져다 쓰기 위한 내용이 아니기 때문에 바로 적용되지 않는 에러가 나게 된다. 이를 해결하기위해 값을 가져다 쓸 수 있게 하는 output 을 이용해 값을 재사용할 수 있게 하자.

# 공인 IP 를 서버에서 가져오기
output "server_ip" {
  value = ncloud_server.server.public_ip
}
# 공인 IP 를 생성하면서 가져오기
output "public_ip" {
  value = ncloud_public_ip.test.public_ip
}
terraform plan

terraform apply

Init script

기존 ncp 서버에서는 init script 를 이용하여 서버가 생성되면 특정 유저를 과정내에서 생성하여 ssh 접속을 편하게 했었다.

# init script

#!/bin/bash

USERNAME="lion"
PASSWORD="****************"
REMOTE_DIRECTORY="/home/$USERNAME/"

echo "Add user"
useradd -s /bin/bash -d $REMOTE_DIRECTORY -m $USERNAME

echo "Set password"
echo "$USERNAME:$PASSWORD" | chpasswd

echo "Set sudo"
usermod -aG sudo $USERNAME
echo "$USERNAME ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers.d/$USERNAME

echo "Update apt and Install docker & docker-compose"
sudo apt-get update
sudo apt install -y docker.io docker-compose

echo "Start docker"
sudo service docker start && sudo service docker enable

echo "Add user to 'docker' group"
sudo usermod -aG docker $USERNAME

echo "done"

이 부분 역시 테라폼에서 리소스로 해결이 가능하다.

서버에 대한 내용은 이미 존재하기 떄문에 넘어가고 init 에 집중해서 코드를 구현한다.

resource "ncloud_init_script" "init" {
  name    = "set-docker-tf"
  content = <<EOT
#!/bin/bash

USERNAME="lion"
PASSWORD="****************"
REMOTE_DIRECTORY="/home/$USERNAME/"

echo "Add user"
useradd -s /bin/bash -d $REMOTE_DIRECTORY -m $USERNAME

echo "Set password"
echo "$USERNAME:$PASSWORD" | chpasswd

echo "Set sudo"
usermod -aG sudo $USERNAME
echo "$USERNAME ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers.d/$USERNAME

echo "Update apt and Install docker & docker-compose"
sudo apt-get update
sudo apt install -y docker.io docker-compose

echo "Start docker"
sudo service docker start && sudo service docker enable

echo "Add user to 'docker' group"
sudo usermod -aG docker $USERNAME

echo "done"
EOT
} # 인덴트가 진짜 중요하니까 꼭 맞춰서 넣기!
resource "ncloud_server" "server" {
  ...
	...
	...
  init_script_no            = ncloud_init_script.init.init_script_no
}

DB instance

NCP 를 통해서 인스턴스를 2개 띄워서 서버로 하나, DB 로 하나를 사용했다. terraform 으로도 2개의 인스턴스를 띄워서 활용할 수 있도록 해보자

NCP 에서도 그랬지만 VPC 나 init script 등은 공유하고, 인스턴스나 공유 IP 등은 따로따로 관리 헀다. 같은 원리로 코드를 추가해보자

# DB instance 생성
resource "ncloud_server" "db" {
  subnet_no                 = ncloud_subnet.main.id
  name                      = "db-staging"
  server_image_product_code =  "SW.VSVR.OS.LNX64.UBNTU.SVR2004.B050"
  server_product_code       = data.ncloud_server_products.products.server_products[0].product_code # 서버스펙 설정
  login_key_name            = ncloud_login_key.loginkey.key_name
  init_script_no            = ncloud_init_script.init.init_script_no
}
# 공인 아이피 설정 및 부여
resource "ncloud_public_ip" "db" { # db 용
    server_instance_no = ncloud_server.db.instance_no
    description = "public IP for db server"
}

# 공인 IP 를 생성하면서 가져오기
output "db_public_ip" {
  value = ncloud_public_ip.db.public_ip
}

728x90
반응형

'Dev. > Terraform' 카테고리의 다른 글

Terraform: Modules  (0) 2023.09.05
Terraform: LoadBalancer  (0) 2023.09.05
Terraform: AWS - VPC 생성  (0) 2023.09.04
Terraform: 설치와 기본정보  (0) 2023.09.01
Terraform: IaC  (0) 2023.09.01

댓글