変数の優先順位と出力の設計
한국어 원문으로 표시합니다.
목표
같은 변수에 네 가지 방법으로 값을 넣어 우선순위를 직접 확인하고, 검증·지역값·출력·민감값까지 갖춘 설정 하나를 완성합니다.
왜 중요한가
"변수를 바꿨는데 반영이 안 된다"는 질문의 답은 거의 언제나 우선순위입니다. 도구는 같은 이름의 값을 여러 자리에서 받아들이고, 충돌해도 오류를 내지 않고 조용히 더 센 쪽을 씁니다. 편리한 만큼 디버깅이 어려워지므로, 덮어쓰라고 만든 값은 약한 자리에, 반드시 지켜야 할 값은 강한 자리에 두는 감각이 필요합니다. 특히 명령줄로 넘긴 값은 무엇이든 이기지만 어디에도 기록되지 않아, 장애 대응에서 쓰고 코드에 반영하지 않으면 다음 배포가 그것을 조용히 되돌립니다. 마지막으로 sensitive = true 는 화면 출력만 가릴 뿐 상태 파일과 JSON 출력에는 값이 그대로 남습니다. 이 한계를 모른 채 "민감 표시를 했으니 안전하다"고 믿는 것이 가장 흔한 사고의 시작입니다.
단계
/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)./root/tf/vars/terraform.tfvars에environment = "stage"를 적고 다시 적용한 뒤, 출력을/root/tf/vars/out/tfvars-outputs.json에 저장하세요. 값이stage로 바뀌어야 합니다 — 파일이 기본값을 이깁니다.- 이번에는 명령줄에서
-var environment=prod로 값을 주고 적용한 뒤, 출력을/root/tf/vars/out/cli-outputs.json에 저장하세요.tfvars-outputs.json은 그대로 두어야 합니다 (여전히stage). variables.tf에owner변수를 선언하되 기본값을platform으로 박아 두지 마세요.TF_VAR_owner=platform환경변수로 값을 넘겨 적용하고, 출력을/root/tf/vars/out/env-outputs.json에 저장하세요 (.owner.value가platform).outputs.tf에owner출력도 추가합니다.variables.tf에replica_count변수를 추가하고 1 이상 5 이하만 허용하는validation블록을 넣으세요.condition과error_message가 모두 있어야 하고,error_message안에 허용 범위가1-5라는 글자 그대로 들어가야 합니다. 범위를 벗어난 값(예:-var replica_count=9)으로 실행해 거부당한 출력을/root/tf/vars/out/validation.txt에 저장하세요./root/tf/vars/main.tf에locals블록을 만들고name_prefix를environment와owner를 하이픈으로 이어 붙인 값으로 정의하세요.outputs.tf에name_prefix출력을 추가합니다. 8번에서 다시 만들cli-outputs.json의name_prefix는prod-platform이어야 합니다.- 출력을
/root/tf/vars/outputs.tf한 곳에 모으고 최소 네 개(environment,owner,name_prefix,config_path)를 두되 모든 출력에description을 다세요.config_path는 이 설정이 만드는local_file의filename을 그대로 내보냅니다. 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으로 적어 두는 것. 그러면 환경변수가 통했는지 증명할 수 없어 채점이 거부합니다.
타입·기본값·설명을 갖춘 변수 선언하기
/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).
변수 블록에는 값 말고도 붙일 것이 있습니다. 셋 다 없으면 몇 달 뒤 이 값이 무엇인지 아무도 모릅니다. 출력은 -json 으로 뽑아 저장하세요.
tfvars 파일로 기본값 덮어쓰기
/root/tf/vars/terraform.tfvars 에 environment = "stage" 를 적고 다시 적용한 뒤, 출력을 /root/tf/vars/out/tfvars-outputs.json 에 저장하세요. 값이 stage 로 바뀌어야 합니다 — 파일이 기본값을 이깁니다.
디렉터리 안의 특정 이름을 가진 파일은 따로 지정하지 않아도 자동으로 읽힙니다. 파일 안에서는 이름 = 값 형식만 씁니다.
명령줄 값으로 파일을 이기기
이번에는 명령줄에서 -var environment=prod 로 값을 주고 적용한 뒤, 출력을 /root/tf/vars/out/cli-outputs.json 에 저장하세요. tfvars-outputs.json 은 그대로 두어야 합니다 (여전히 stage).
우선순위의 꼭대기는 실행할 때 직접 준 값입니다. 앞 단계에서 저장한 출력 파일은 덮어쓰지 말고 새 파일에 남기세요.
환경변수로 값 주입하기
variables.tf 에 owner 변수를 선언하되 기본값을 platform 으로 박아 두지 마세요. TF_VAR_owner=platform 환경변수로 값을 넘겨 적용하고, 출력을 /root/tf/vars/out/env-outputs.json 에 저장하세요 (.owner.value 가 platform). outputs.tf 에 owner 출력도 추가합니다.
변수 이름 앞에 정해진 접두어를 붙인 환경변수를 도구가 알아서 읽습니다. 기본값에 같은 값을 박아 두면 환경변수가 통했는지 증명할 수 없습니다.
허용 범위를 코드로 못 박기
variables.tf 에 replica_count 변수를 추가하고 1 이상 5 이하만 허용하는 validation 블록을 넣으세요. condition 과 error_message 가 모두 있어야 하고, error_message 안에 허용 범위가 1-5 라는 글자 그대로 들어가야 합니다. 범위를 벗어난 값(예: -var replica_count=9)으로 실행해 거부당한 출력을 /root/tf/vars/out/validation.txt 에 저장하세요.
변수 블록 안에 조건과 메시지를 담는 블록을 넣습니다. 메시지는 사용자가 그것만 보고 고칠 수 있어야 하므로 허용 범위를 글자 그대로 적으세요.
locals 로 이름 접두어 조합하기
/root/tf/vars/main.tf 에 locals 블록을 만들고 name_prefix 를 environment 와 owner 를 하이픈으로 이어 붙인 값으로 정의하세요. outputs.tf 에 name_prefix 출력을 추가합니다. 8번에서 다시 만들 cli-outputs.json 의 name_prefix 는 prod-platform 이어야 합니다.
locals 는 밖에서 주입할 수 없는 이름 붙인 식입니다. 두 변수를 하이픈으로 이어 붙인 값을 만들고 출력으로 내보내세요.
설명이 붙은 출력 모아 두기
출력을 /root/tf/vars/outputs.tf 한 곳에 모으고 최소 네 개(environment, owner, name_prefix, config_path)를 두되 모든 출력에 description 을 다세요. config_path 는 이 설정이 만드는 local_file 의 filename 을 그대로 내보냅니다.
출력은 이 설정의 공개 인터페이스이므로 한 파일에 모읍니다. 하나라도 설명이 빠지면 채점이 개수를 세어 잡아냅니다.
민감값 가리기와 그 한계 확인하기
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 에 저장하세요. 후자에는 값 대신 가려진 표시가 있어야 하고 실제 토큰 문자열이 보이면 안 됩니다.
변수와 출력 양쪽에 민감 표시가 필요합니다. 사람이 보는 출력과 기계가 읽는 출력을 각각 저장해 두 결과가 어떻게 다른지 비교하세요.