Terraform 실전 · 지우지 않고 소유를 내려놓기 · 실습
코드에서 지웠더니 운영 중인 것이 부서질 뻔했다
목표
리소스를 부수지 않고 상태에서만 빼는 removed 블록을 써 보고, 이 판의 removed 가 무엇을 받는지 도구에게 직접 물어 기록하고, moved 로 이름만 바꾸고, -replace 와 taint 로 하나만 다시 만든 뒤, 모듈 하나를 통째로 내려놓습니다.
왜 중요한가
인프라 코드를 오래 운영하면 코드와 실물의 소유 관계를 손대야 하는 날이 옵니다. 팀이 갈라지고, 다른 도구로 옮기고, 넘겨받은 것을 되돌려 줍니다. 그런데 설정에서 리소스 블록을 지우는 것은 도구에게 '부숴라' 로 읽힙니다 — 소유를 내려놓는다는 뜻이 아닙니다. 그래서 그 뜻을 따로 말하는 선언이 필요하고, 명령이 아니라 선언으로 하는 이유는 리뷰와 기록 때문입니다. 누가 언제 무엇을 상태에서 뺐는지가 커밋에 남습니다. 여기에 한 가지 함정이 더 있습니다 — 문서는 언제나 최신판을 설명하지만 여러분이 쓰는 판은 그보다 낮을 수 있습니다. removed 블록이 받는 인자가 판마다 다르다는 것을 알고, 문서가 아니라 손에 있는 도구에게 물어 확인하는 습관이 이 모듈에서 배울 두 번째 것입니다.
단계
1. /root/tfa-removed/keep.tf 에 random_pet.keep(length 2)과 그 이름을 out/keep.txt 에 쓰는 local_file.keep 을, /root/tfa-removed/legacy.tf 에 out/legacy.txt 에 legacy service 한 줄을 쓰는 local_file.legacy 를 두고 init·apply 하세요. 그다음 상태 파일을 /root/tfa-removed/snapshots/before.tfstate 로 한 번만 복사합니다.
2. /root/tfa-removed/legacy.tf 를 지우고 /root/tfa-removed/removed.tf 에 removed 블록으로 local_file.legacy 를 상태에서 빼겠다고 선언하세요. apply 전에 계획 출력을 /root/tfa-removed/removed-plan.txt 에 저장하고 apply 합니다. out/legacy.txt 는 그대로 남아 있어야 합니다.
3. /root/tfa-removed/removed.tf 의 removed 블록 안에 lifecycle 블록(destroy = false) 를 잠깐 넣고 tofu plan 을 돌려 결과를 /root/tfa-removed/lifecycle-probe.txt 에 저장한 뒤 원래대로 되돌리세요.
그다음 /root/tfa-removed/removed-facts.tsv 에 세 줄을 탭 두 칸으로 적습니다 — tofu_version 은 이 파드의 코어 버전, removed_lifecycle 은 supported 또는 unsupported, removed_effect 는 forget 또는 destroy.
4. /root/tfa-removed/keep.tf 의 random_pet.keep 을 random_pet.app 으로 바꾸고(참조도 함께), /root/tfa-removed/moved.tf 에 moved 블록으로 옛 주소에서 새 주소로 옮긴다고 선언한 뒤 apply 하세요. 그다음 /root/tfa-removed/moved.tsv 에 before(1단계 사본에 적힌 random_pet.keep 의 id)와 after(지금 상태의 random_pet.app 의 id) 두 줄을 탭 두 칸으로 적습니다. 두 값은 같아야 합니다.
5. /root/tfa-removed/legacy.tf 를 잠깐 되살려(2단계와 같은 내용) tofu plan 을 돌리고, 출력을 /root/tfa-removed/conflict.txt 에 저장한 뒤 다시 그 파일을 지우세요. removed 블록은 그대로 둡니다. 마지막에 계획은 깨끗해야 합니다.
6. 상태 파일을 /root/tfa-removed/snapshots/before-replace.tfstate 로 복사한 뒤 tofu apply -replace=random_pet.app -auto-approve 를 돌리세요. 그다음 /root/tfa-removed/replace.tsv 에 before(사본의 id)와 after(지금 id) 두 줄을 탭 두 칸으로 적습니다. 두 값은 달라야 합니다.
7. tofu taint random_pet.app 으로 표시한 뒤, 상태에 적힌 그 인스턴스의 상태 값을 /root/tfa-removed/taint-status.txt 에 한 줄로 저장하고 tofu plan 출력을 /root/tfa-removed/taint-plan.txt 에 저장하세요. 그다음 tofu untaint 로 되돌려 계획이 깨끗한 상태로 마칩니다.
8. /root/tfa-removed/modules/archive/main.tf 에 out/archive-1.txt·out/archive-2.txt 두 파일을 쓰는 모듈을 만들고 /root/tfa-removed/archive.tf 에서 module "archive" 로 부른 뒤 apply 하세요. 그다음 /root/tfa-removed/archive.tf 를 지우고 /root/tfa-removed/archive-removed.tf 에 removed 블록으로 module.archive 를 통째로 상태에서 빼세요. 계획 출력은 /root/tfa-removed/module-plan.txt 에 저장하고, 두 파일은 디스크에 남아야 합니다.
참고
- 파드에는 OpenTofu 1.9.0 과 local·random 프로바이더 미러가 있어 인터넷 없이 돕니다.
- state mv·state rm 로 하는 상태 수술은 iac-basics 의 상태 실습에서 다룹니다. 이 실습은 같은 일을 선언으로 하는 쪽입니다.
- 흔한 실수: removed 블록을 넣으면서 리소스 블록을 지우지 않는 것. 그러면 계획 단계에서 막힙니다(5단계에서 직접 봅니다).
- 흔한 실수: 일을 끝낸 뒤 removed 블록을 치우지 않는 것. 그 주소의 리소스가 언젠가 다시 필요해지면 그때 막힙니다.
- [Removing Resources](https://opentofu.org/docs/language/resources/syntax/#removing-resources) · [moved](https://opentofu.org/docs/language/modules/develop/refactoring/) · [Command: taint](https://opentofu.org/docs/cli/commands/taint/) · [Command: untaint](https://opentofu.org/docs/cli/commands/untaint/) · [Command: apply](https://opentofu.org/docs/cli/commands/apply/)
단계 8개
- 넘겨받은 것까지 한 상태에 담는다
- 상태에서만 빼고 실물은 남긴다
- 이 판의 removed 가 무엇을 받는지 도구에게 묻는다
- 이름만 바꾼다 — 같은 것을 다시 만들지 않고
- 잊으라고 해 놓고 다시 선언하면
- 하나만 다시 만든다
- 손으로 표시했다가 되돌린다
- 모듈 하나를 통째로 내려놓는다