시작 하며...
예전에 같은 팀원이 테라폼을 사용해 인프라 환경을 관리하는 것을 본적이 있었다. 그때 당시에 아예 생각치 못한 분야의 도구라는 느낌에 신기해 했었는데, 이번에 한번 직접 사용해보고 싶어 진행중인 프로젝트의 인프라 구조를 테라폼을 활용해 작성해보기로 했다.
Terraform
Hashicorp 사에서 개발한 오픈 소스 소프트웨어로, Iac (Infrastructrue as Code) 도구이다.
말 그대로 인프라 관련 자원들을 코드를 통해 관리할 수 있도록 해주는 도구인 것이다.
클라우드 플랫폼에는 다양한 서비스들이 존재하고, 보통은 해당 클라우드 서비스의 콘솔 GUI 혹은 CLI로 접속해 조작이 가능하다.
이러한 서비스들을 GUI나 특정 플랫폼에 종속되는 CLI가 아닌, Terraform 이라고 하는 플랫폼에 종속받지 않는 생태계에서 조작이 가능한 것이다. (AWS, NCP, GCP, Azure 등등 다양한 클라우드 플랫폼을 지원한다.)
테라폼은 Go 언어로 개발되었으며, HCL이라는 언어를 사용해 클라우드 서비스 리소스들을 정의한다.
Terraform 생태계
Naver Cloud Platform / terraform-ncloud-docs [Github] (테라폼 - ncloud 관련 다양한 리소스들 정보(Product Name 및 Code)들 이 문서화 되어있는 저장소)
Naver Cloud Platform / terraform-provider-ncloud [Github] (테라폼 - ncloud provider 가 존재하는 저장소. 여기 또한 docs가 존재하지만, 공식 문서 페이지에서 보는게 조금 더 편하다.
Naver Cloud Platform / terraform docs (공식 문서)
테라폼을 사용하기 이전에, 테라폼 생태계를 간단하게 이해할 필요가 있다.
핵심만 말하자면, NCP 리소스를 테라폼을 통해 관리하는 Provider는 테라폼 측에서 개발하는 것이 아니다!
Terraform은 기본적으로 플러그인 아키텍처를 사용해 다양한 클라우드 서비스와 연동할 수 있도록 하는 인터페이스와 같은 것들을 만들어 놓고, 각 클라우드 서비스 제공업체에서 본인들의 Provider를 개발 해 Terraform Registry에 등록하여 사용하는 형태로 이루어져 있다.
즉, NCP 가 테라폼을 지원하기 위해서는 NCP 측에서 본인들의 서비스들을 Terraform 을 통해 조작할 수 있게 해주는 Provider를 직접 개발해서 등록해야 하는 것이다.
그렇기에, 각 여러가지 플랫폼을 Terraform을 통해 조작할 수 있지만, 플랫폼 별로 리소스를 다루는 방법과 해당 리소스에 필요한 메타데이터들은 상이할 수 있으며, 이는 각 플랫폼의 문서를 꼼꼼히 살펴봐야 한다.
Terraform + Ncloud로 VPC 구축해보기!
백문이불여일견 이라고, 일단 한번 실행을 시켜 보자.
1. Terraform 설치하기
테라폼 공식 홈페이지의 Install 탭으로 가면, 플랫폼 별로 설치할 수 있는 방법이 나와 있다.
설치해주자.
2. 테라폼 프로젝트 시작하기
// terraform.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
}
먼저 디렉톡리를 하나 만들고 어떠한 Provider를 사용할 것인지 명시해기 위해 terraform.tf
에 위와 같은 정보들을 입력해 준다.
그 후 provider
에 ncloud에서 사용할 정보들을 넣어준다. 현재는 변수명으로 처리되어있는데 해당 변수들을 정의하는 파일은 아래와 같다.
// variables.tf
variable "access_key" {
description = "NCP access_key"
type = string
}
variable "secret_key" {
description = "NCP secret_key"
type = string
}
variable "region" {
description = "NCP region"
type = string
default = "KR"
}
variable "site" {
description = "NCP site"
default = "public"
}
variable "support_vpc" {
description = "NCP support vpc"
default = "true"
}
variable "zones" {
default = "KR-1"
}
위와 같이 필요한 변수들을 문자열에 의존하지 않고, 별도의 변수들로 관리할 수 있다. 보면 default
값을 주어 원하는 값을 기본값으로 넣어주었다.
그 중 access_key
나 seceret_key
처럼 민감한 데이터들은 별도의 파일로 분리하여 값을 넣어줄 수 있다. 이 파일은 반드시 .gitignore
에 추가하여 저장소에 공유되지 않도록 관리하자!
// terroform.tf.vars
access_key = "{ncp에서 발급받은 액세스 키}"
secret_key = "{ncp에서 발급받은 시크릿 키}"
혹여나, access_key와 secret_key를 발급받는 곳이 어딘지 모르겠으면 Ncloud API 인증키 발급 방법 문서 를 참고하자.
위 내용들을 작성했다면, 이제 아래 명령어를 쳐 주자.
terraform init
위 명령어를 통해 필요한 작업 디렉토리를 초기화 해줄 수 있다. 기본적인 준비들은 모두 끝났다. 이제 리소스를 하나 정의 해 보자.
3. VPC 생성하기
# Resource : VPC 리소스
resource "ncloud_vpc" "main" {
name = "vpc-tf"
ipv4_cidr_block = "192.168.0.0/24"
}
# Resource : 서브넷 리소스 (Public)
resource "ncloud_subnet" "public" {
name = "sbn-public-tf"
vpc_no = ncloud_vpc.main.id
subnet = cidrsubnet(ncloud_vpc.main.ipv4_cidr_block, 8, 0)
zone = var.zones
network_acl_no = ncloud_vpc.main.default_network_acl_no
subnet_type = "PUBLIC"
}
# Resource : 서브넷 리소스 (Private)
resource "ncloud_subnet" "private" {
name = "sbn-private-tf"
vpc_no = ncloud_vpc.main.id
subnet = cidrsubnet(ncloud_vpc.main.ipv4_cidr_block, 8, 1)
zone = var.zones
network_acl_no = ncloud_vpc.main.default_network_acl_no
subnet_type = "PRIVATE"
}
보면 resource
키워드 앞에 미리 정의되어있는 리소스 명이 오고, 그 다음에 해당 리소스의 이름(별칭) 이 추가된다.
후자는 사용자가 붙이는 이름이고, 전자는 공식문서에서 정의하는 해당 리소스의 정식 명칭이다. 이를 헷갈리지 말자.
각 리소스별로 필요한 메타데이터들이 다르다. 예를들어 ncloud_vpc
리소스의 경우 해당 리소스에 대한 공식 문서를 참고하면 해당 리소스가 필요로 하는 값들이 어떤것이 있는지 확인할 수 있다. 이를 잘 참고해 작성해주자.
4. 테라폼 실행하기
terraform plan
plan
명령어를 통해 테라폼에 작성한 내용들을 simulate 해볼 수 있다. 이 단계에서 작성한 구문에 문제는 없는지, 어떠한 리소스들이 생성될 것인지 미리 확인할 수 있다.
terrafrom apply
apply
명령어는 내가 작성한 내용들을 실제 클라우드 서비스에 적용시키는 명령어이다. 위 plan대로라면, 1개의 VPC가 새롭게 생성되고 해당 VPC아래 2개의 Subnet이 생성될 것이다.
terraform destroy
destroy
명령어는 현재 작성되어 있는 테라폼 리소스들을 모두 삭제 해버리는 명령어이다.
5. 문서를 참고해 다양한 리소스들 다루어 보기
위에서 언급한 공식 문서에는 앞선 예제인 VPC, Subnet과 달리 NCP에 존재하는 다양한 리소스들을 활용하는 방법과 해당 리소스들에 필요한 메타데이터들의 정보들이 포함되어 있다.
내가 Server 를 생성하고 싶으면 ncloud_server 문서에 들어가 필요한 데이터들을 정의해주고 작성해서 실행시키면 된다.
마치며
테라폼을 활용하면, 팀원들간 인프라 작업 내용을 간편하게 코드로 공유할 수 있고, 더욱 체계적인 조작이 가능해진다.
다만 아쉬운 점은 테라폼을 할때는 문서를 찾아보고 실행 테스트해보는데에 90% 이상의 시간을 쏟는 것 같아 조금 피곤하다...ㅎㅎㅎ
인프라 구조가 복잡해지고, 사용하는 클라우드 리소스가 많아질 수록 체계적인 관리의 중요도는 높아지기에, 테라폼은 협업 측면에서 많은 도움을 받을 수 있는 도구인 것 같다.
'DevOps' 카테고리의 다른 글
네이버 클라우드 플랫폼(Ncloud) 사용 후기 (0) | 2024.12.22 |
---|---|
[Docker] 간단한 도커 명령어 모음집 (0) | 2024.05.04 |