LabHub
学习 学习路径 课程

Terraform/OpenTofu 基础

变量优先级与输出设计

在 LabHub 中继续学习

한국어 원문으로 표시합니다.

목표

같은 변수에 네 가지 방법으로 값을 넣어 우선순위를 직접 확인하고, 검증·지역값·출력·민감값까지 갖춘 설정 하나를 완성합니다.

왜 중요한가

"변수를 바꿨는데 반영이 안 된다"는 질문의 답은 거의 언제나 우선순위입니다. 도구는 같은 이름의 값을 여러 자리에서 받아들이고, 충돌해도 오류를 내지 않고 조용히 더 센 쪽을 씁니다. 편리한 만큼 디버깅이 어려워지므로, 덮어쓰라고 만든 값은 약한 자리에, 반드시 지켜야 할 값은 강한 자리에 두는 감각이 필요합니다. 특히 명령줄로 넘긴 값은 무엇이든 이기지만 어디에도 기록되지 않아, 장애 대응에서 쓰고 코드에 반영하지 않으면 다음 배포가 그것을 조용히 되돌립니다. 마지막으로 sensitive = true 는 화면 출력만 가릴 뿐 상태 파일과 JSON 출력에는 값이 그대로 남습니다. 이 한계를 모른 채 "민감 표시를 했으니 안전하다"고 믿는 것이 가장 흔한 사고의 시작입니다.

단계

  1. /root/tf/vars/variables.tfenvironment 변수를 선언하세요. type = string, default = "dev", description 이 모두 있어야 합니다. /root/tf/vars/outputs.tf 에 이름이 environment 인 출력을 만들고, 기본값 그대로 적용한 뒤 출력을 JSON 으로 /root/tf/vars/out/default-outputs.json 에 저장하세요 (.environment.valuedev).
  2. /root/tf/vars/terraform.tfvarsenvironment = "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.tfowner 변수를 선언하되 기본값을 platform 으로 박아 두지 마세요. TF_VAR_owner=platform 환경변수로 값을 넘겨 적용하고, 출력을 /root/tf/vars/out/env-outputs.json 에 저장하세요 (.owner.valueplatform). outputs.tfowner 출력도 추가합니다.
  5. variables.tfreplica_count 변수를 추가하고 1 이상 5 이하만 허용하는 validation 블록을 넣으세요. conditionerror_message 가 모두 있어야 하고, error_message 안에 허용 범위가 1-5 라는 글자 그대로 들어가야 합니다. 범위를 벗어난 값(예: -var replica_count=9)으로 실행해 거부당한 출력을 /root/tf/vars/out/validation.txt 에 저장하세요.
  6. /root/tf/vars/main.tflocals 블록을 만들고 name_prefixenvironmentowner 를 하이픈으로 이어 붙인 값으로 정의하세요. outputs.tfname_prefix 출력을 추가합니다. 8번에서 다시 만들 cli-outputs.jsonname_prefixprod-platform 이어야 합니다.
  7. 출력을 /root/tf/vars/outputs.tf 한 곳에 모으고 최소 네 개(environment, owner, name_prefix, config_path)를 두되 모든 출력에 description 을 다세요. config_path 는 이 설정이 만드는 local_filefilename 을 그대로 내보냅니다.
  8. variables.tfapi_token 변수를 sensitive = true 로 선언하고 값은 TF_VAR_api_token 으로 넘기세요. outputs.tf 에도 api_token 출력을 sensitive = true 로 추가합니다. 마지막으로 -var environment=prodTF_VAR_owner=platform, TF_VAR_api_token 을 함께 주고 적용한 뒤 cli-outputs.json 을 다시 만들고, 사람이 읽는 형식의 출력도 /root/tf/vars/out/sensitive.txt 에 저장하세요. 후자에는 값 대신 가려진 표시가 있어야 하고 실제 토큰 문자열이 보이면 안 됩니다.

참고

타입·기본값·설명을 갖춘 변수 선언하기

/root/tf/vars/variables.tfenvironment 변수를 선언하세요. type = string, default = "dev", description 이 모두 있어야 합니다. /root/tf/vars/outputs.tf 에 이름이 environment 인 출력을 만들고, 기본값 그대로 적용한 뒤 출력을 JSON 으로 /root/tf/vars/out/default-outputs.json 에 저장하세요 (.environment.valuedev).

변수 블록에는 값 말고도 붙일 것이 있습니다. 셋 다 없으면 몇 달 뒤 이 값이 무엇인지 아무도 모릅니다. 출력은 -json 으로 뽑아 저장하세요.

tfvars 파일로 기본값 덮어쓰기

/root/tf/vars/terraform.tfvarsenvironment = "stage" 를 적고 다시 적용한 뒤, 출력을 /root/tf/vars/out/tfvars-outputs.json 에 저장하세요. 값이 stage 로 바뀌어야 합니다 — 파일이 기본값을 이깁니다.

디렉터리 안의 특정 이름을 가진 파일은 따로 지정하지 않아도 자동으로 읽힙니다. 파일 안에서는 이름 = 값 형식만 씁니다.

명령줄 값으로 파일을 이기기

이번에는 명령줄에서 -var environment=prod 로 값을 주고 적용한 뒤, 출력을 /root/tf/vars/out/cli-outputs.json 에 저장하세요. tfvars-outputs.json 은 그대로 두어야 합니다 (여전히 stage).

우선순위의 꼭대기는 실행할 때 직접 준 값입니다. 앞 단계에서 저장한 출력 파일은 덮어쓰지 말고 새 파일에 남기세요.

환경변수로 값 주입하기

variables.tfowner 변수를 선언하되 기본값을 platform 으로 박아 두지 마세요. TF_VAR_owner=platform 환경변수로 값을 넘겨 적용하고, 출력을 /root/tf/vars/out/env-outputs.json 에 저장하세요 (.owner.valueplatform). outputs.tfowner 출력도 추가합니다.

변수 이름 앞에 정해진 접두어를 붙인 환경변수를 도구가 알아서 읽습니다. 기본값에 같은 값을 박아 두면 환경변수가 통했는지 증명할 수 없습니다.

허용 범위를 코드로 못 박기

variables.tfreplica_count 변수를 추가하고 1 이상 5 이하만 허용하는 validation 블록을 넣으세요. conditionerror_message 가 모두 있어야 하고, error_message 안에 허용 범위가 1-5 라는 글자 그대로 들어가야 합니다. 범위를 벗어난 값(예: -var replica_count=9)으로 실행해 거부당한 출력을 /root/tf/vars/out/validation.txt 에 저장하세요.

변수 블록 안에 조건과 메시지를 담는 블록을 넣습니다. 메시지는 사용자가 그것만 보고 고칠 수 있어야 하므로 허용 범위를 글자 그대로 적으세요.

locals 로 이름 접두어 조합하기

/root/tf/vars/main.tflocals 블록을 만들고 name_prefixenvironmentowner 를 하이픈으로 이어 붙인 값으로 정의하세요. outputs.tfname_prefix 출력을 추가합니다. 8번에서 다시 만들 cli-outputs.jsonname_prefixprod-platform 이어야 합니다.

locals 는 밖에서 주입할 수 없는 이름 붙인 식입니다. 두 변수를 하이픈으로 이어 붙인 값을 만들고 출력으로 내보내세요.

설명이 붙은 출력 모아 두기

출력을 /root/tf/vars/outputs.tf 한 곳에 모으고 최소 네 개(environment, owner, name_prefix, config_path)를 두되 모든 출력에 description 을 다세요. config_path 는 이 설정이 만드는 local_filefilename 을 그대로 내보냅니다.

출력은 이 설정의 공개 인터페이스이므로 한 파일에 모읍니다. 하나라도 설명이 빠지면 채점이 개수를 세어 잡아냅니다.

민감값 가리기와 그 한계 확인하기

variables.tfapi_token 변수를 sensitive = true 로 선언하고 값은 TF_VAR_api_token 으로 넘기세요. outputs.tf 에도 api_token 출력을 sensitive = true 로 추가합니다. 마지막으로 -var environment=prodTF_VAR_owner=platform, TF_VAR_api_token 을 함께 주고 적용한 뒤 cli-outputs.json 을 다시 만들고, 사람이 읽는 형식의 출력도 /root/tf/vars/out/sensitive.txt 에 저장하세요. 후자에는 값 대신 가려진 표시가 있어야 하고 실제 토큰 문자열이 보이면 안 됩니다.

변수와 출력 양쪽에 민감 표시가 필요합니다. 사람이 보는 출력과 기계가 읽는 출력을 각각 저장해 두 결과가 어떻게 다른지 비교하세요.