Terraform - state와 workspace

박민우·2025년 6월 14일
0

Terraform

목록 보기
2/2

🌱state란?

  • 테라폼 구성 파일은 기존 state와 실제 인프라 구성을 비교해 실행 계획에서 생성, 수정, 삭제 여부를 결정한다.
  • terraform plan을 실행하면 암묵적으로 refresh 동작을 수행하면서 리소스 생성의 대상과 state를 기준으로 비교하는 과정을 거친다.
  • -refresh = false 플래그를 사용해 리소스 생성 대상과의 동기화 과정을 생략하고 state를 기준으로 실행 계획을 생성할 수 있다.

terraform plan 실행 시 기본 동작 과정

  1. 현재 상태(state file) 로컬 또는 remote backend에서 읽어옴

  2. 리프레시(refresh): 현재 클라우드의 실제 리소스 상태를 API로 조회해서 .tfstate와 비교

    ⇒ 만약 여기서 실제 리소스 상태와 state가 다르다면, 실제 리소스 상태에 맞춰서 state 파일을 동기화

  3. 계획 생성(plan): .tf 코드와 현재 상태를 비교해서 어떤 변경이 필요한지 계산


💡 refresh=false란?

terraform plan -refresh=false

이 명령은 👉 2번의 상태 리프레시를 건너뛰겠다는 뜻입니다.

즉, Terraform은 현재 .tfstate 파일만 믿고 변경 사항을 계산합니다.

실제 클라우드 자원이 어떤 상태인지 조회하지 않습니다.


Plan과 Apply에서 각 리소스에 발생할 수 있는 작업의 종류

기호의미행동비고
+Create(add)리소스 생성
-Destroy리소스 삭제
-/+Replace(destroy & add)리소스 삭제 후 생성lifecycle의 create_before_destroy 옵션을 통해 생성 후 삭제를 수행하도록 설정할 수 있다.
~Update in-place(change)리소스 수정

Replace (/+) vs Update in-place (~)

구분Replace (-/+)Update in-place (~)
의미기존 리소스를 삭제하고 새로 생성기존 리소스를 그대로 두고 속성만 변경
리소스 ID❌ 새 ID로 변경됨✅ 기존 ID 유지됨
다운타임있음 (삭제 → 생성)없음 (대부분)
예시 속성인스턴스 타입, 서브넷, VPC 변경 등태그, 디스크 크기, 설명 등
트리거 조건리소스 특성상 변경 불가능한 속성 변경 시변경 가능한 속성 수정 시
로그 기호-/+~

Replace (-/+)변경이 안 되는 속성은 리소스를 삭제하고 새로 만듦 (ID 변경)
Update (~)리소스는 유지하면서 속성만 바꿈 (ID 유지)

🌱 workspace란?

  • state를 관리하는 논리적인 가상 공간을 의미합니다.
    => 하나의 루트 모듈에서 다른 환경을 위한 리소스를 동일한 테라폼 구성으로 프로비저닝하고 관리할 수 있습니다.
  • 새로운 워크스페이스가 생성되면 실행한 루트 모듈 디렉토리에 terraform.tfstate.d 디렉토리가 생성되고 하위에 생성한 워크스페이스 이름을 확인할 수 있습니다.
  • 테라폼 구성에서 terraform.workspace를 사용하여 workspace 이름을 읽으면 workspace 기준으로 문자열을 지정하거나 조건을 부여할 수 있습니다.
    workspace 이름을 조건으로 동일한 코드 구성으로 다른 조건의 리소스를 생성 하는 예시
    resource "aws_instance" "web" {
      count = "${terraform.workspace == "default" ? 5 : 1}"
      ami = "~"
      instance_type = "t3.micro"
    }

🌱 workspace 관련 명령어 모음

# 새로운 워크스페이스 생성 => 자동으로 해당 워크스페이스로 전환됨 
$terraform workspace new <workspsace name>

# 사용 중인 워크스페이크 확인
$terraform workspace show

# 활성화된 워크스페이스 변경
$terraform workspace select <workspsace name>

# 워크스페이스 삭제
$terraform workspace delete <workspsace name>
profile
꾸준히, 깊게

0개의 댓글