Terraform workspace 사용법

서재민·2021년 3월 20일
2

Terraform

목록 보기
13/15

Workspace

일반적으로 서버 개발자들은 목적에 따라 여러개의 환경을 구성하여 서버를 구축한다. (일반적인 예가 dev, staing, production 으로 서버를 각각 구축하여 운영하는 것이다.)
따라서 Terraform 으로 서버 환경을 구축하기 위해서는 이 부분에 대한 고려가 필요한데, 다양한 방법이 있지만 그 중 하나가 Terraform CLI 에서 제공하는 workspace다.
workspace란 단어 그대로 구축하고자 하는 서버 환경에 따라 workspace 를 나누어서 각 서버의 상태를 관리하겠다는 뜻이다.
즉 3개의 서버 환경이 구성되어 있고 3개의 workspace 를 만들어서 각각 infrastructure 를 구성하였다면, 총 3개의 상태파일(.tfstate)이 각각 생성되어 관리가 될 것이다.
예제와 함께 사용법에 대해 더 쉽게 알아보자.

예제 코드

먼저 workspace 테스트를 위해 사용할 코드에 대해 먼저 살펴보자.
https://github.com/gentledev10/terraform_examples/tree/main/workspace

# dev.tfvars
region = "ap-northeast-1"
name   = "dev"
# main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}

provider "aws" {
  region = var.region
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = var.name
  }
}
# prod.tfvars
region = "ap-northeast-2"
name = "prod"
# variables.tf
variable "region" {
  type        = string
  description = "AWS region"
}

variable "name" {
  type        = string
  description = "VPC name"
}

workspace 를 테스트 하는 것이 목적이기 때문에 간단한 코드를 사용했으며, region 과 VPC 이름을 input variables로 전달받아 생성하는 예제이다.
dev, prod 로 환경을 분리하여 테스트 하기위해 dev.tfvars, prod.tfvars 로 파일을 분리하여 각각 input variables 를 사용하도록 했다.

사용법

이제 위의 예제 코드와 함께 workspace 사용법에 대해 익혀보자.
터미널에서 다음과 같이 workspace 의 명령어들을 확인할 수 있다.

$ terraform workspace -h
Usage: terraform workspace

  new, list, show, select and delete Terraform workspaces.

Subcommands:
    delete    Delete a workspace
    list      List Workspaces
    new       Create a new workspace
    select    Select a workspace
    show      Show the name of the current workspace

먼저 dev 환경을 구성하기 위해 dev workspace 를 생성해보자.
아래의 명령어를 통해 dev workspace 를 생성과 동시에 선택할 수 있다.

$ terraform workspace new dev
Created and switched to workspace "dev"!

You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.

만들어 놓은 dev 용 input variables 를 사용하여 적용해보자.

$ terraform apply -var-file=dev.tfvars

적용을 완료하면 도쿄 리전에(ap-northeast-1) 'dev' 이름을 가진 VPC 가 생성된다.

이번에는 prod workspace 를 생성하고 적용해보자.
dev workspace 를 생성할때와 동일하게 아래와 같이 생성한다.

$ terraform workspace new prod
Created and switched to workspace "prod"!

You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.

만들어 놓은 prod 용 input variables 를 사용하여 적용해보자.

$ terraform apply -var-file=prod.tfvars

적용을 완료하면 서울 리전에(ap-northeast-1) 'prod' 이름을 가진 VPC 가 생성된다.

이렇게 main 코드의 분리 없이 환경만 분리하여 작업을 할 수 있으며, terraform workspace select 명령어로 적용하고자 하는 workspace만 선택 후 변경사항을 적용하면 된다.

상태관리

그렇다면 workspace는 어떤 방식으로 동작하는걸까?
사실 정말 간단하다.
위에서 dev, prod 로 분리하여 서버환경을 구축해봤는데, 해당 폴더의 구조를 한번 살펴보자.

├── dev.tfvars
├── main.tf
├── prod.tfvars
├── terraform.tfstate.d
│   ├── dev
│   │   └── terraform.tfstate
│   └── prod
│       └── terraform.tfstate
└── variables.tf

terraform.tfstate.d 라는 폴더가 생성된게 보이고, 그 아래에 dev, prod 폴더가 각각 생성되어 상태파일인 .tfstate 파일이 관리되고 있는 것을 볼 수 있다.
이처럼 workspace 는 생성된 workspace 의 이름으로 폴더를 만들고 각각 .tfstate 파일을 만들어 상태를 관리하게 된다.

profile
Software engineer

0개의 댓글