상태(State) 관리
상태(State) 관리
Terraform은 어쩌면 당연한 질문을 풀어야 해요. "코드에 이렇게 적었는데, 실제 세계에는 지금 뭐가 있고, 뭐가 달라졌지?" 이 질문에 답하기 위해 Terraform은 워크스페이스가 관리하는 인프라와 구성을 **상태(state)**로 저장해요. 상태는 실제 세계의 리소스를 설정과 연결해 주고, 메타데이터를 추적하며, 큰 인프라에서 성능을 높이는 데도 쓰여요.
상태가 없으면 Terraform은 무엇을 만들고, 바꾸고, 지울지 계산할 수 없어요. 실제로는 그냥 "코드와 상태를 비교해 차이를 계획(plan)한다"고 이해하면 돼요. Terraform은 어떤 작업을 하기 전에 항상 refresh로 상태를 실제 인프라에 맞춘 뒤, 그 상태를 기준으로 변경 계획을 세워요.
왜 상태가 필요한가
상태의 핵심 역할은 원격 시스템의 객체와, 설정에 선언된 리소스 인스턴스 사이의 연결(binding)을 저장하는 거예요. 설정이 바뀌어서 원격 객체가 생성되면, Terraform은 그 객체의 정체를 특정 리소스 인스턴스에 기록해요. 이후 설정이 바뀌면 그 기록을 보고 해당 객체를 갱신하거나 삭제해요.
즉 상태는 "어떤 리소스 인스턴스가 어떤 실제 객체에 해당하는가"의 지도(map) 역할을 하고, 그 지도가 있어야 Terraform이 변경을 안전하게 계산할 수 있어요.
상태를 어디에 저장할까
기본적으로 Terraform은 각 워크스페이스의 상태를 로컬 파일에 저장해요. 상태는 terraform.tfstate, 이전 상태의 백업은 terraform.tfstate.backup이라는 파일에 남아요. 로컬 저장은 추가 설정이 필요 없지만 두 가지 단점이 있어요. 팀원과 협업하기 어렵고, 로컬 파일이 유실되면 상태를 잃을 위험이 있어요.
그래서 공식 문서는 상태를 **HCP Terraform이나 리모트 백엔드(remote backend)**에 저장하길 권장해요. 그래야 상태를 안전하게 보관하고 팀원과 함께 쓰는 동시에, 상태 잠금(locking)과 접근 제어도 얻을 수 있어요. 반면 상태를 버전 관리 시스템(VCS) 같은 곳에 그냥 올려 두는 건 피해야 해요. 상태 잠금이 안 되고 접근 제어도 없어서, 데이터 유실이나 상태 파일 안의 비밀 노출로 이어질 수 있어요.
상태 파일 다루기: 직접 손대지 말 것
상태는 JSON 텍스트 파일이지만, 직접 편집하지 않는 게 원칙이에요. 필요한 변경은 Terraform이 제공하는 terraform state 명령으로 처리해요. 예를 들어 이미 외부에서 만든 객체를 가져올 땐 terraform import, 어떤 객체를 상태에서 "잊게" 할 땐 terraform state rm을 써요.
terraform state list
terraform state show aws_instance.web
terraform state rm aws_instance.example
이런 명령의 출력은 grep, awk 같은 유닉스 도구와 잘 어울리게 설계되어 있어요. 그리고 명령은 상태 포맷이 아래 깔리든 잘 돌아가도록 유지되니, 직접 파싱하기보다 CLI를 쓰는 게 안전해요.
상태 포맷과 외부 연동
상태 스냅샷은 JSON 형식이고, 새 Terraform 버전은 대체로 이전 버전이 만든 상태와 하위 호환돼요. 다만 상태 포맷 자체는 새 버전에서 바뀔 수 있어서, 상태를 직접 파싱하거나 수정하는 소프트웨어를 만든다면 지속적으로 유지보수해야 해요.
외부 소프트웨어가 상태를 소비하도록 만들어진 연동 지점도 있어요.
terraform output명령의-json옵션 — 루트 모듈 출력값 전체 또는 특정 출력값을 최신 상태 스냅샷에서 얻을 수 있어요.terraform show명령의-json옵션 — 최신 상태 스냅샷 전체, 그리고 저장된 플랜 파일(그 시점의 이전 상태 포함)을 조사할 수 있어요.
자동화 환경에서는 terraform apply 직후에 이 명령들을 바로 실행해 최신 상태 스냅샷을 얻고, 그 결과를 자동 실행의 산출물로 저장해 두는 식으로 쓰는 게 흔해요. 그렇게 하면 Terraform을 직접 돌리지 않고도 다른 소프트웨어가 그 결과를 가져다 쓸 수 있어요.
더 알아보기
- 리소스 다루기 — 상태가 추적하는 대상
- 공식 문서: State, State purpose, Backend 설정, terraform state 명령