Terraform/OpenTofu 기초 · 선언형과 상태 · 실습
첫 선언과 상태 파일 읽기
목표
선언 하나가 실제 파일과 상태 파일이라는 두 결과를 동시에 만든다는 것을 손으로 확인하고, 상태를 열어 리소스 주소·serial·의존성을 읽을 수 있게 됩니다.
왜 중요한가
선언형 도구를 처음 만나면 "명령어를 외우는 일"처럼 보이지만, 실제로 배워야 하는 것은 도구가 무엇을 근거로 판단하는가입니다. Terraform 은 코드(원하는 상태), 상태 파일(마지막으로 아는 상태), 실제 인프라(지금 있는 것) 세 가지를 비교해 계획을 만듭니다. 그래서 상태 파일을 잃으면 도구는 이미 존재하는 리소스를 "처음 보는 것"으로 여겨 다시 만들려 들고, 상태에 남은 유령 리소스는 "지우겠다"고 말합니다. 이 실습에서 상태를 jq 로 직접 열어 보는 이유가 여기 있습니다. 또 하나, 값을 하드코딩할 것인가 참조할 것인가는 취향이 아니라 그래프의 문제입니다. 참조해야만 도구가 순서를 알고, 나중에 앞 리소스가 바뀔 때 뒤 리소스도 함께 갱신됩니다.
단계
1. /opt/lab/fixtures/terraform/starter/main.tf 를 /root/tf/first/main.tf 로 복사하고 그 디렉터리에서 초기화하세요. required_providers 블록이 그대로 남아 있어야 하며, 초기화 뒤 /root/tf/first/.terraform.lock.hcl 과 /root/tf/first/.terraform/providers 가 생기고 잠금 파일에 local 프로바이더가 적혀 있어야 합니다.
2. main.tf 에 타입이 local_file, 이름이 hello 인 리소스를 선언하세요. filename 은 /root/tf/first/out/hello.txt 이고, 내용을 담는 인자 이름은 content 입니다.
3. 적용해서 /root/tf/first/out/hello.txt 를 만드세요. 내용은 hello opentofu 로 둡니다. 적용 뒤 /root/tf/first/terraform.tfstate 에 local_file.hello 가 등록되고, 상태에 기록된 content 와 실제 파일 내용이 정확히 같아야 하며, 상태의 version 은 4 여야 합니다.
4. 타입이 random_pet, 이름이 suffix 인 리소스를 추가해 적용하세요. length 는 2 로 두고 prefix 는 주지 마세요. 상태에 random_pet.suffix 가 생기고 만들어진 이름은 단어-단어 형태여야 합니다.
5. hello 의 내용을 hello labhub 로 바꿔 다시 적용하세요. 파일 내용과 상태에 기록된 content 가 모두 정확히 hello labhub 여야 하고, 상태의 serial 은 2 이상이어야 합니다.
6. 타입이 local_file, 이름이 temp 인 리소스를 /root/tf/first/out/temp.txt 로 한 번 만들었다가 다시 제거하세요. 제거할 때의 출력을 /root/tf/first/out/destroy.txt 에 저장합니다. 끝난 뒤 temp.txt 파일과 상태의 local_file.temp 는 사라지고 local_file.hello 는 남아 있어야 합니다.
7. 상태에 등록된 리소스 주소 목록을 /root/tf/first/out/state-list.txt 에 저장하세요. local_file.hello 와 random_pet.suffix 가 각각 한 줄씩 있어야 하고 local_file.temp 는 없어야 합니다 (6번을 끝낸 뒤에 뽑으세요).
8. 타입이 local_file, 이름이 summary 인 리소스를 /root/tf/first/out/summary.txt 로 만드세요. 내용에는 random_pet.suffix 가 만든 이름과 hello labhub 가 모두 들어가야 하며, 두 값 모두 다른 리소스의 속성을 참조해서 넣어야 합니다. 적용 뒤 상태의 local_file.summary 의 dependencies 에 random_pet.suffix 가 보여야 합니다.
참고
- 이 환경의 명령은
tofu이고terraform이라는 이름으로도 부를 수 있습니다. 하위 명령과 옵션 구조는 같습니다. - 인터넷은 없지만
local,random,null,tls프로바이더가 이미지 안 파일시스템 미러에 들어 있어 초기화가 됩니다. - 상태는 눈으로 읽는 것보다
jq로 뽑는 편이 빠릅니다..version,.serial,.lineage,[.resources[].type + "." + .resources[].name]정도면 충분합니다. - 흔한 실수 1: 내용 끝에 줄바꿈을 넣어 상태의
content가hello labhub\n이 되는 것. 5번은 정확한 일치를 봅니다. - 흔한 실수 2: 8번에서 만들어진 펫 이름을 눈으로 보고 문자열에 그대로 적는 것. 파일 내용은 통과해도 의존 관계가 생기지 않아 실패합니다.
단계 8개
- 작업 디렉터리 초기화하고 프로바이더 받기
- local_file 리소스 선언하기
- 적용해서 파일과 상태를 함께 만들기
- random_pet 으로 무작위 이름 만들기
- 선언을 바꾸고 다시 적용하기
- 임시 리소스만 골라 지우기
- 상태에 등록된 주소 뽑기
- 참조로 요약 파일 만들기