✅ 이 블로깅은 테라폼으로 시작하는 IaC 책을 기반으로 작성한다.


워크스페이스는 State를 관리하는 논리적인 가상 공간이다.

워크스페이스는 작업 환경을 분리하는 데에 목적이 있다. 참고로 워크스페이스로 작업을 분리할 수도 있지만 파일 레이아웃을 이용해서 디렉토리 별로 환경 분리를 할 수도 있다.

이건 여담인데, 나도 프로젝트에서 테라폼을 사용하지는 않지만, github에서 소스코드를 관리할 때 브랜치별로도 환경을 분리하고 디렉토리 별로도 소스코드마다 필요한 환경의 코드를 분리해 준다.

본론으로 돌아가서 terraform workspace를 사용해 보자!

$ terraform workspace list
	* default

몰랐는데 기본적으로 default 워크스페이스를 사욯하고 있었다

default 워크스페이스 사용

resource "aws_instance" "mysrv1" {
  ami           = "ami-0ea4d4b8dc1e46212"
  instance_type = "t2.micro"
  tags = {
    Name = "t101-week4"
  }
}

EC2 인스턴스 생성하는 main.tf 파일을 작성하고 배포하였다.

Untitled

$ terraform state list
	aws_instance.mysrv1
$ cat terraform.tfstate | jq -r '.resources[0].instances[0].attributes.public_ip'
	43.201.247.10
$ cat terraform.tfstate | jq -r '.resources[0].instances[0].attributes.private_ip'
	172.31.10.117

위와 같이 state가 저장되었다.

Untitled 1

그래프로 확인해 보면 평상시와 다를거 없이 배포가 되었다

신규 워크스페이스 생성

$ terraform workspace new mywork1
	Created and switched to workspace "mywork1"!
	
	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 show
	mywork1

terraform workspace new 명령어로 mywork1이라는 워크스페이스를 생성하였다.

$ ls -al
	total 16
	drwxr-xr-x 1 gain gain 4096 Sep 24 02:47 .
	drwxr-xr-x 1 gain gain 4096 Sep 24 02:20 ..
	drwxr-xr-x 1 gain gain 4096 Sep 24 02:47 .terraform
	-rw-r--r-- 1 gain gain 1377 Sep 24 02:22 .terraform.lock.hcl
	-rw-r--r-- 1 gain gain  599 Sep 24 02:24 graph.dot
	-rw-r--r-- 1 gain gain 3498 Sep 24 02:25 graph.svg
	-rw-r--r-- 1 gain gain  147 Sep 24 02:20 main.tf
	-rw-r--r-- 1 gain gain 4817 Sep 24 02:23 terraform.tfstate
	drwxr-xr-x 1 gain gain 4096 Sep 24 02:47 terraform.tfstate.d
$ tree terraform.tfstate.d
	terraform.tfstate.d
	└── mywork1
	
	1 directory, 0 files

현재 init을 수행한 디렉토리에 있는 내용이다.

terraform.tfstate.d에 내가 생성한 워크스페이스가 들어 있으며, 이제 향후 저장되는 state는 여기에서 관리된다!

5.3$ terraform workspace show
	mywork1
5.3$ cd ..
$ terraform workspace show
	default

지금 5.3 디렉토리에서는 mywork1 워크스페이스가 사용되고 그 상위 디렉토리로 다시 가면 default 워크스페이스를 사용하고 있다

이로써 디렉토리 별로 워크스페이스 사용이 논리적으로 분리된다는 점을 확인했다!

이제 실제 리소스를 배포해 보면! plan과 apply 실행 시 둘다 새로운 리소스를 생성한다고 출력된다

------------------------------
t101-week4      43.201.247.10   running
t101-week4      3.35.219.42     running
------------------------------

Untitled 2

실제로 똑같은 이름의 인스턴스 두 대가 실행 중이며

$ terraform workspace list
	  default
	* mywork1
$ cat terraform.tfstate | jq -r '.resources[0].instances[0].attributes.public_ip'
	43.201.247.10
$ cat terraform.tfstate.d/mywork1/terraform.tfstate | jq -r '.resources[0].instances[0].attributes.public_ip'
	3.35.219.42

terraform.tfstatedefault 워크스페이스에서의 state 파일, terraform.tfstate.d/mywork1/terraform.tfstatemywork1 워크스페이스에서의 state 파일을 의미한다.

Untitled 3

그래프로 확인해 봐도 동일한 리소스가 생성됨을 알 수 있다

워크스페이스 선택

$ terraform workspace select default
	Switched to workspace "default".
$ terraform workspace list
	* default
	  mywork1

terraform workspace select로 워크스페이스 선택이 가능하다

결론

  • 장점
    • 하나의 루트 모듈에서 다른 환경을 위한 리소스를 동일한 테라폼 구성으로 논리적으로 분리하여 프로비저닝하고 관리할 수 있다.
    • 기존 프로비저닝된 환경에 영향을 주지 않고 새로운 환경에서 변경 사항을 실험할 수 있다.
    • 깃의 브랜치 전략처럼 동일한 구성에서 서로 다른 리소스 결과를 관리해야 한다
  • 단점
    • State가 동일한 저장소(로컬 또는 백엔드)에 저장되어 State 접근 권한 관리가 어렵다.
    • 모든 환경에 따라 리소스 사용량이 다른 것처럼 테라폼 코드는 동일하더라도 변수 처리해야 할 수 있는 상황에서 테라폼 구성에 분기 처리가 다수 발생할 수 있다.
    • 프로비저닝 대상에 대한 인증 요소를 완벽하게 분리하기는 어렵다

      ⇒ 이는 디렉터리 기반의 레이아웃을 사용하거나 Terraform Cloud 환경의 워크스페이스를 활용하는 것이 좋다고 한다.

Categories:

Updated:

Leave a comment