안녕하세요 깍돌이 입니다.

 

옛날에는 학습하면서 있던 트러블 슈팅들을 전부 포스팅 했었는데 솔직히 변명이지만 현재 너무 바쁘게 일상생활을 살아가고있어서 ( 노는거 아님 ) 

 

오늘은 테라폼(IAC) 를 이용하여서 NCP ( Naver Cloud Platform ) 에 인프라를 세팅 할수 있도록 적용해보려고 합니다.

IAC에 대해서는 구글에 검색하면 엄청 설명 잘되어있는 곳이 있기 때문에 생략 하겠습니다. 

우선 IAC에 대해서는 대략적으로는 알고 있는 상태이기 때문에 테라폼에 대해서 알아 보겠습니다.

What is Terraform?

이제 앞으로 작성되는 개요에서 설명은 공식 홈페이지를 참고합니다. 

https://developer.hashicorp.com/terraform/intro

내용들을 읽다 보면 "클라우드 및 온프레미스 리소스를 안전하고 효율적으로 빌드, 변경 , 버전화 할수 있는 인프라 도구" 라고 되어있습니다.  대표적으로는 AWS , Azure, GCP, OCP , Docker 등을 설명하고 있습니다.

 

테라폼 구조

기본적으로 테라폼은 PROVIDER를 통해서 벤더 클라우드사의 API(OPEN API ) 와의 연동을 통해서 진행되는 구조임을 알수 있습니다.

크게 3가지의 구조를 가진다고 합니다.

Write : 리소스를 정의 (VPC , Subnet, VM 등의 배포 구성)

Plan : 기존 인프라 및 구성을 기반으로 생성, 업데이트 , 삭제 할 인프라를 어떻게 할지에 대한 계획을 설정

Apply : apply 할 경우 모든 리소스 종속성을 고려하여 올바른 순서대로 작업을 수행 ( vpc, subnet, vm 이 있다면 vpc-> subnet- vm 으로 올바른 순서를 찾아서 수행 ) vpc를 수정하게될 경우 확장전의 vpc를 재생성 

 

위와같은 순서를 보게 될 경우 크게는

 

API -> Write -> Plan -> Apply 같은 순서로 진행됨을 알수 있습니다. 

API : NCP의 ACC,SEC 설정

Write : .tf 소스를 작성하는 구간으로 어떤식으로 자원을 구성할지에 대한 설정

Plan : Write 에 작성된 tf를 읽어서  생성이 되는지 오류가 없는지 어떻게 생성되는 등에 대한 내용 을 확인

Apply : 현재 작성된 내용으로 인프라를 적용

 

Terraform

설명은 대충 여기까지만 하고 Windows 에서 설치 및 동작을 확인해보겠습니다.

https://developer.hashicorp.com/terraform/downloads

스펙에 맞는 테라폼 다운로드 및 압축 해제 ( zip으로 되어있고 압축 해제하면 terraform.exe만 나옵니다 )

C:\terraform 폴더 생성 후 이동

 

Windows - 고급 시스템 설정 - 고급 - 환경 변수 ( N ) 에서 

path 에 편집으로 테라폼 경로 추가  및 terraform --version 테스트

1.3.7 Windows_386 확인

기본적인 샘플 파일 작성 및 동작 확인을 위해서 main.tf , outputs.tf , variables.tf, versions.tf 를 작성합니다.

main.tf

provider "ncloud" {
  access_key = var.access_key
  secret_key = var.secret_key
  region     = var.region
}

data "ncloud_regions" "regions" {
}

data "ncloud_server_images" "server_images" {
}

resource "ncloud_server" "server" {
  name                      = var.server_name
  server_image_product_code = var.server_image_product_code
  server_product_code       = var.server_product_code
}

 

variable.tf

variable "access_key" { 
  default = ""
}

variable "secret_key" { 
  default = ""
}

variable "region" {
  default = "KR"
}

variable "server_name" {
  default = "terraform-test"
}

variable "server_image_product_code" {
  default = "SPSW0LINUX000046"
}

variable "server_product_code" {
  default = "SPSVRHICPUSSD002" 
}

versions.tf

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

terraform plan 후 terraform apply 하면 서버를 생성합니다. 

그리고 server_name 을 변경시

위와같이 plan 이 나오고  terraform apply 시 변경이 시작됩니다.

 

** 주의사항 기본 샘플 파일로 이것저것 하다가 문제점은 아니지만 기대결과랑 다른 경우가 있습니다.

NCP에서 서버는 server_image_product_code ( OS 코드 ) 와 server_product_code ( OS에 따른 스펙코드 ) 쌍으로 이루어지게 됩니다.

 

테라폼에서 OS코드에 맞지 않는 스펙코드를 사용할경우 500이 발생하며 중지되는건 이해가 됩니다. 

예를들면 Windows는 100G만 지원하지만 windows 2016에 리눅스 스펙코드를 넣으면 (리눅스는 only 50g) 오류가 나는게 정상이니까요 

 

하지만 지원되는 스펙 코드지만 오류가 나는 케이스가 있습니다.

NCP의 경우 Classic과 VPC 2개의 플랫폼을 제공하고 있는데요 

server spec change에서 다른점이 하나 있습니다. VPC는 Standard -> HiCPU 로의 타입을 넘어선 스펙변경이 가능하다는 점이고 Classic은 불가능 하다는 점입니다.

Classic에서 변경이 되는 타입은 Compact, Standard 입니다. 그외에는 모두 같은 타입에서만 스펙 변경이 가능합니다.

 

VPC같은 경우는 모든 스펙 을 넘어선 변경이 지원되기 때문에 문제가 되지 않습니다. 

 

그래서 저는 Terraform 은 해당 인프라를 구성해주는 역할을 한다고 생각 했기에 hicpu 로 만들어진 Classic서버를 Standard로 하고 apply 하면 오류가 없을거라 생각 했습니다.

 

HICPU -> Standard 로 변경시

오류 발생 

Classic에서는 지원되지 않는게 정상이기 때문에 API 를 통해 벤더사와 연결하는 테라폼에서는 위와같은 에러를 정상적으로 받고 apply 를 종료하게 됩니다.  아무생각없이 이경우라면 저는 다시한번 재시도해서 정지 -> 반납 -> 원하는 스펙으로 생성 해주길 기대했는데 그렇진 않았습니다.

 

서버 이름 변경시에는 terminate -> create 지만

서버 스펙 변경 은   stop -> modify -> boot (또는 modify)같은 형태로 넘어가게 됩니다.  테라폼에서 말하는 멱등성에서도 벤더사의 케이스에 따라 오류가 나는 부분이 있을수 있기 때문에 학습 하는 과정에서 이런 예외처리등을 많이 확인해야 될거 같습니다.

 

* 추가 - 서버 설명 변경도 벤더사에서 지원해주는 API 가 없기 때문에 stop - terminate -> create(이때 설명을 새로 넣음) 

같은 형태로 넘어가게 됩니다. 별거 아닌거 수정한다고 건드리면 자주 지우고 만들거 같네요

 

다음 포스팅은 data, resource 및 파일 구조 terraform plan, terraform apply 시 어떤 동작이 되는지에 대해 작성하겠습니다.

 

 

 

 

+ Recent posts