Terraform 맛보기

  • Post author:
  • Post category:칼럼
  • Post comments:0 Comments
  • Post last modified:February 8, 2020

Google Cloud Platform 교육 이후에 심심풀이 땅콩 개인 프로젝트를 여기서 돌려보기로 했다. 개인 프로젝트라 해도 그저 깨작거리는 정도에 불과히지만 GCP를 익히는데는 충분히 도움이 되지 싶다. AWS와는 또다른 맛이 있단 말이다.

처음에는 gcloud 명령을 이용해 간단히 bash 스크립트를 작성하는 일로 시작했다. aws 명령어와 달리 gcloud 명령어는 매우 쓰기 쉽게 구성되어 있어서 공식 문서는 거의 읽지 않고도 이런저런 작업을 진행할 수 있었다. 구글이 기술은 뛰어나도 사용자 친화적인 기업이라고 생각한 적은 솔직히 드물었는데 이번에 달리 생각하게 됐다.

아무튼 초기에 작성한 스크립트는 대충 이런 모양이다.

#!/bin/bash

export CLOUDSDK_COMPUTE_ZONE=asia-east1-a

PROJECT_NAME=myproject
CLUSTER_NAME=myproject
DNS_NAME="myproject.com"

gcloud projects list | grep ${PROJECT_NAME} >> /dev/null
if [ $? -ne 0 ]; then
  echo "Go to Google Cloud Platform and create a project and run this script again."
  exit 1
fi

gcloud dns managed-zones describe ${DNS_NAME} >> /dev/null
if [ $? -ne 0 ]; then
  gcloud dns managed-zones create prod-zone --description="Production DNS zone" --dns-name="${DNS_NAME}"
fi

gcloud container clusters describe ${CLUSTER_NAME} >> /dev/null
if [ $? -ne 0 ]; then
  gcloud components install kubectl
  gcloud container clusters create ${CLUSTER_NAME}
fi

이 스크립트가 뭘하는지 대충 설명하자면

  1. GCP 프로젝트가 생성되어 있는지 확인한다. GCP 프로젝트는 명령줄에선 생성하지 못하고 웹 콘솔에서 생성해야 하므로 여기서는 프로젝트 생성여부만 확인하는 것이다.
  2. 프로젝트에서 쓸 도메인을 Cloud DNS에 등록한다.
  3. 그러고 나서 Google Container Engine에 클러스터를 생성한다.

여기까지는 오류 처리 등이 다소 번거롭긴 해도 bash 스크립트로 어찌어찌 됐다. 하지만 좀더 복잡한 작업을 하려니 보통 귀찮은 게 아니다. 그래서 Terraform을 적용해보기로 했다. 안 그래도 일전에 AWS Cloudformation 스크립트를 쓰다가 너무 짜증나는 면이 많아서 그 대안으로 Terraform을 유심히 살펴보던 차였다. 아무튼 Terraform으로 이전해보니 Puppet 다루던 때도 떠오르고 여러 모로 나쁘지 않다.

variable "compute_region" {
  default = "asia-east1"
}

variable "compute_zone" {
  default = "asia-east1-a"
}

variable "project_name" {
  default = "myproject"
}

variable "project_id" {
  default = "this-is-myproject-id"
}

variable "cluster_name" {
  default = "myproject"
}

variable "dns_name" {
  default = "myproject.com"
}

provider "google" {
  credentials = "${file("account.json")}"
  project     = "${var.project_id}"
  region      = "${var.compute_region}"
}

resource "google_dns_managed_zone" "prod" {
  name        = "prod-zone"
  dns_name    = "${var.dns_name}"
  description = "Production DNS zone"
}

resource "google_container_cluster" "primary" {
  name = "${var.cluster_name}"
  zone = "${var.compute_zone}"
  initial_node_count = 3

  master_auth {
    username = "mr.yoda"
    password = "adoy.rm"
  }
}

간단해 보이지만 GCP 프로젝트를 미리 생성해놓지 않은 경우에는

google_container_cluster.primary: googleapi: Error 503: Project unchartedsky-146813 is not fully initialized with the default service accounts. Please try again later., backendError

와 같이 오류 메시지가 나오는 등 세세한 부분에서 손수 꼼꼼하게 짠 bash 스크립트는 상대가 안 되는 품질을 보여준다. MacOS에서는 Homebrew를 이용해 매우 쉽게 terraform을 설치할 수 있으므로 장벽도 거의 없으니 한번쯤 가볍게 도전해보면 좋겠다.

brew install terraform

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.