본문 바로가기

IaC/Terraform

[Terraform]테라폼 workspace 이해하기

Terraform Workspace란 무엇인가요?

Terraform Workspace는 Terraform으로 인프라를 코드로 관리할 때 중요한 부분입니다. 이를 이해하기 위해서는 먼저 '상태'의 개념을 알아야 합니다.

상태 (State)란 무엇인가요?

테라폼을 사용하여 인프라를 변경하거나 관리할 때, 그 변경사항을 기록하는 파일입니다. .terraform.tfstate라는 파일에 이 정보가 저장되며, 이 파일을 통해 테라폼은 어떤 변경이 필요한지를 알 수 있습니다. 그리고 이 상태 파일을 기준으로 여러 프로젝트를 관리하는 것이 '워크스페이스'입니다.

그럼 테라폼 워크스페이스란?

  • 워크스페이스는 **상태 관리의 '단위'**라고 볼 수 있습니다.
  • 한 프로젝트 내에서 여러 개의 .tf 파일을 가진 디렉토리가 여러 워크스페이스로 동작할 수 있습니다.

워크스페이스 사용 사례

환경별로 (개발, 스테이징, 프로덕션) 네트워크 설정 코드가 다를 때, 각 코드를 복사하여 사용하는 것은 관리가 힘듭니다.

대신 워크스페이스를 사용하여 코드와 데이터를 분리해 작성하면 훨씬 간결하고 효율적으로 관리할 수 있습니다.

워크스페이스 관련 명령어들

 tf workspace -h
Usage: terraform [global options] 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

워크스페이스 목록 확인: terraform workspace list

현재 사용가능한 workspace 목록을 확인할 수 있다.

 tf workspace list
* default

현재 워크스페이스 확인: terraform workspace show

 tf workspace show
default

새 워크스페이스 생성 및 삭제: terraform workspace new/delete [workspace name]

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.

 terraform workspace list    
  default
* prod

 terraform workspace delete prod
Deleted workspace "prod"!

 terraform workspace list       
* default

다른 워크스페이스 선택: terraform workspace select [workspace name]

select option을 이용하여 현재 workspace를 변경할 수 있다.

 terraform workspace select default
Switched to workspace "default".

 terraform workspace list          
* default
  prod

워크스페이스 파일 구조: terraform.tfstate.d

워크스페이스를 사용하면, 각 워크스페이스에 대한 상태가 terraform.tfstate.d 디렉토리 내에 저장됩니다.

tree                    
.
├── custom.tfvars
├── dev.tfvars
├── main.tf
├── prod.tfvars
├── staging.tfvars
└── terraform.tfstate.d
    ├── dev
    │   └── terraform.tfstate
    ├── prod
    │   └── terraform.tfstate
    └── staging
        └── terraform.tfstate

실습: 환경별 워크스페이스 생성

1. 환경 변수 파일 생성

다음과 같은 내용의 파일을 각 환경에 맞게 생성합니다.

  • prod.tfvars
  • dev.tfvars
  • staging.tfvars
# prod.tfvars
vpc_name = "prod"

# dev.tfvars
vpc_name = "dev"

# staging.tfvars
vpc_name = "staging"

2. workspace 생성 - prod, dev, staging

# terraform workspace new [환경 이름]
 terraform workspace new prod

 terraform workspace list       
  default
  dev
* prod
  staging

3. 각 환경 설정 및 실행

환경에 맞게 워크스페이스를 선택한 후, 해당 환경의 변수 파일을 사용하여 테라폼을 실행합니다.

dev 환경 설정: select workspace && tf apply

 terraform workspace select dev    
Switched to workspace "dev".

 tf apply -var-file=dev.tfvars
>>>
# 중략
Do you want to perform these actions in workspace "dev"?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

staging 환경 설정: select workspace && tf apply

 terraform workspace select staging    
Switched to workspace "staging".

 tf apply -var-file=staging.tfvars

Do you want to perform these actions in workspace "staging"?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

prod 환경 설정: select workspace && tf apply

 terraform workspace select prod    
Switched to workspace "prod".

 tf apply -var-file=prod.tfvars

Do you want to perform these actions in workspace "prod"?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

결과 확인: AWS 콘솔

AWS 콘솔을 통해 각 환경별로 생성된 VPC를 확인할 수 있습니다.

 

참고
https://developer.hashicorp.com/terraform/language/state/workspaces