Terraform/OpenTofu 기초 · 변수와 출력 · 실습
변수 우선순위와 출력 설계
목표
같은 변수에 네 가지 방법으로 값을 넣어 우선순위를 직접 확인하고, 검증·지역값·출력·민감값까지 갖춘 설정 하나를 완성합니다.
왜 중요한가
"변수를 바꿨는데 반영이 안 된다"는 질문의 답은 거의 언제나 우선순위입니다. 도구는 같은 이름의 값을 여러 자리에서 받아들이고, 충돌해도 오류를 내지 않고 조용히 더 센 쪽을 씁니다. 편리한 만큼 디버깅이 어려워지므로, 덮어쓰라고 만든 값은 약한 자리에, 반드시 지켜야 할 값은 강한 자리에 두는 감각이 필요합니다. 특히 명령줄로 넘긴 값은 무엇이든 이기지만 어디에도 기록되지 않아, 장애 대응에서 쓰고 코드에 반영하지 않으면 다음 배포가 그것을 조용히 되돌립니다. 마지막으로 sensitive = true 는 화면 출력만 가릴 뿐 상태 파일과 JSON 출력에는 값이 그대로 남습니다. 이 한계를 모른 채 "민감 표시를 했으니 안전하다"고 믿는 것이 가장 흔한 사고의 시작입니다.
단계
1. /root/tf/vars/variables.tf 에 environment 변수를 선언하세요. type = string, default = "dev", description 이 모두 있어야 합니다. /root/tf/vars/outputs.tf 에 이름이 environment 인 출력을 만들고, 기본값 그대로 적용한 뒤 출력을 JSON 으로 /root/tf/vars/out/default-outputs.json 에 저장하세요 (.environment.value 가 dev).
2. /root/tf/vars/terraform.tfvars 에 environment = "stage" 를 적고 다시 적용한 뒤, 출력을 /root/tf/vars/out/tfvars-outputs.json 에 저장하세요. 값이 stage 로 바뀌어야 합니다 — 파일이 기본값을 이깁니다.
3. 이번에는 명령줄에서 -var environment=prod 로 값을 주고 적용한 뒤, 출력을 /root/tf/vars/out/cli-outputs.json 에 저장하세요. tfvars-outputs.json 은 그대로 두어야 합니다 (여전히 stage).
4. variables.tf 에 owner 변수를 선언하되 기본값을 platform 으로 박아 두지 마세요. TF_VAR_owner=platform 환경변수로 값을 넘겨 적용하고, 출력을 /root/tf/vars/out/env-outputs.json 에 저장하세요 (.owner.value 가 platform). outputs.tf 에 owner 출력도 추가합니다.
5. variables.tf 에 replica_count 변수를 추가하고 1 이상 5 이하만 허용하는 validation 블록을 넣으세요. condition 과 error_message 가 모두 있어야 하고, error_message 안에 허용 범위가 1-5 라는 글자 그대로 들어가야 합니다. 범위를 벗어난 값(예: -var replica_count=9)으로 실행해 거부당한 출력을 /root/tf/vars/out/validation.txt 에 저장하세요.
6. /root/tf/vars/main.tf 에 locals 블록을 만들고 name_prefix 를 environment 와 owner 를 하이픈으로 이어 붙인 값으로 정의하세요. outputs.tf 에 name_prefix 출력을 추가합니다. 8번에서 다시 만들 cli-outputs.json 의 name_prefix 는 prod-platform 이어야 합니다.
7. 출력을 /root/tf/vars/outputs.tf 한 곳에 모으고 최소 네 개(environment, owner, name_prefix, config_path)를 두되 모든 출력에 description 을 다세요. config_path 는 이 설정이 만드는 local_file 의 filename 을 그대로 내보냅니다.
8. variables.tf 에 api_token 변수를 sensitive = true 로 선언하고 값은 TF_VAR_api_token 으로 넘기세요. outputs.tf 에도 api_token 출력을 sensitive = true 로 추가합니다. 마지막으로 -var environment=prod 와 TF_VAR_owner=platform, TF_VAR_api_token 을 함께 주고 적용한 뒤 cli-outputs.json 을 다시 만들고, 사람이 읽는 형식의 출력도 /root/tf/vars/out/sensitive.txt 에 저장하세요. 후자에는 값 대신 가려진 표시가 있어야 하고 실제 토큰 문자열이 보이면 안 됩니다.
참고
- 값의 강약은 낮은 것부터
default→TF_VAR_*→terraform.tfvars→*.auto.tfvars→-var-file→-var순입니다. terraform output -json은 기계가 읽는 형식,terraform output은 사람이 읽는 형식입니다. 민감 표시는 후자에서만 가려집니다.cli-outputs.json은 6·7·8번 채점이 모두 들여다보는 파일입니다. 출력을 추가할 때마다, 마지막에는 8번의 값 조합으로 반드시 다시 만드세요.- 흔한 실수 1: 단계마다 같은 파일에 저장해 앞 단계 결과를 잃는 것. 1~4번은 각각 다른 파일에 남겨야 합니다.
- 흔한 실수 2:
owner의 기본값을platform으로 적어 두는 것. 그러면 환경변수가 통했는지 증명할 수 없어 채점이 거부합니다.
단계 8개
- 타입·기본값·설명을 갖춘 변수 선언하기
- tfvars 파일로 기본값 덮어쓰기
- 명령줄 값으로 파일을 이기기
- 환경변수로 값 주입하기
- 허용 범위를 코드로 못 박기
- locals 로 이름 접두어 조합하기
- 설명이 붙은 출력 모아 두기
- 민감값 가리기와 그 한계 확인하기