Terraform Associate 004 #7 설정 작성: 변수 우선순위, 함수, 커스텀 조건
설정 작성 영역은 기초 #3·#4에서 손에 익힌 문법이 대부분이지만, 두 가지가 다릅니다. 시험은 우선순위의 정확한 순서를 묻고, 004는 트랙에서 얕게 지나간 커스텀 조건을 정면으로 묻습니다. 아는 부분은 빠르게 압축하고 보강 부분에 지면을 쓰겠습니다.
변수: 타입과 우선순위 #
타입은 string, number, bool과 컬렉션(list, set, map), 구조형(object, tuple)이 있고, 타입 위반은 plan 전에 거부됩니다. 시험의 단골은 값 입력 경로의 우선순위입니다. 늦게 평가되는 쪽이 이깁니다.
(약함) 환경 변수 TF_VAR_이름
→ terraform.tfvars
→ terraform.tfvars.json
→ *.auto.tfvars (파일명 알파벳 순)
→ -var, -var-file (명령줄, 지정 순서대로) (강함)트랙에서 안 쓴 항목이 둘 끼어 있습니다. *.auto.tfvars는 이름과 무관하게 자동 로드되는 파일이고, tfvars의 JSON 표기도 존재합니다. “같은 변수가 여러 곳에 정의되면?” 문항은 이 사다리에서 더 아래(명령줄 쪽)가 이긴다로 답합니다. sensitive = true는 plan 출력을 가릴 뿐 state에는 평문이라는 것(#5)을 여기서도 되새깁니다.
output과 locals: 압축 복습 #
output은 값의 출구이며 terraform output 명령으로 재조회할 수 있고, output에도 sensitive 표시가 가능하며 모듈 간 통로가 됩니다(#6). locals는 내부 계산에 이름을 붙이는 것으로, 선언은 locals 블록·참조는 local.이름이라는 단복수 차이가 자잘한 함정입니다. “사용자가 바꿀 값은 variable, 내부 조합은 locals"라는 기초 #3의 기준이 설계 문항의 답입니다.
함수와 표현식: 출제 단골만 #
함수는 직접 정의할 수 없고 내장 함수만 쓴다는 대전제가 첫 출제 포인트입니다. 문항에 자주 등장하는 것만 추리면 다음과 같습니다.
- 컬렉션:
length,merge(맵 병합, 뒤가 이김),lookup(맵에서 키 조회, 기본값 지정),toset(for_each용 변환) - 문자열·인코딩:
format,join/split,jsonencode(IAM 정책 단골),base64encode - 파일:
file(내용 읽기),templatefile(변수 치환하며 읽기, user_data 단골) - 타입 판단·조건:
can(표현식 성공 여부),try(실패 시 대체값)
표현식 쪽은 조건식 a ? b : c, for 표현식(대괄호=리스트, 중괄호=맵), 스플랫 [*]이 전부이며 기초 #4 그대로입니다. terraform console이 표현식 실험 도구라는 것도 명령 문항으로 나옵니다.
보강: 커스텀 조건 세 종류 #
004가 강화한 영역입니다. 조건을 어디에 거는지에 따라 세 가지가 있고, 무엇을 검증하는가로 구분합니다.
변수 validation: 입력값 검증. 기초 #3에서 실습한 그것으로, 값이 들어오는 시점에 평가됩니다.
precondition·postcondition: 리소스·데이터 소스·output의
lifecycle블록 안에 거는 가정의 검증입니다.
data "aws_ami" "al2023" {
# ... 조회 조건 ...
lifecycle {
postcondition {
condition = self.architecture == "x86_64"
error_message = "조회된 AMI는 x86_64 아키텍처여야 합니다."
}
}
}
resource "aws_instance" "web" {
ami = data.aws_ami.al2023.id
lifecycle {
precondition {
condition = data.aws_ami.al2023.state == "available"
error_message = "AMI가 available 상태여야 인스턴스를 만들 수 있습니다."
}
}
}precondition은 그 객체를 평가하기 전에 성립해야 할 가정(주로 의존 대상에 대한 확인), postcondition은 평가된 결과가 만족해야 할 보증이며, postcondition 안에서는 self로 자기 속성을 참조합니다. 실패하면 plan·apply가 에러로 멈추므로, “잘못된 전제로 인프라가 만들어지는 것"을 코드가 스스로 막는 장치입니다.
- check 블록: 인프라의 지속적 검증입니다. 최상위
check블록에 assert를 담으며, 결정적 차이는 실패해도 apply를 막지 않고 경고만 남긴다는 것입니다. “배포는 막지 않되 상태를 감시하고 싶다”(인증서 만료 임박 확인 등)가 용도입니다.
구분 문항의 축은 두 개입니다. 검증 대상(입력값 / 가정·결과 / 지속 상태)과 실패의 효과(차단 / 차단 / 경고). 이 두 축만 잡으면 세 장치의 어떤 조합 문항도 풀립니다.
정리 #
이번 글에서 다룬 내용입니다.
- 변수 우선순위는 환경 변수 → tfvars → auto.tfvars → 명령줄 순으로 뒤가 이깁니다. auto.tfvars의 자동 로드가 낯선 항목입니다
- 함수는 내장만 가능하며 merge, lookup, templatefile, jsonencode, try·can이 출제 단골입니다
- validation은 입력값 검증이고 실패 시 차단합니다
- precondition은 평가 전 가정, postcondition은 평가 후 보증이며 self 참조가 가능하고 둘 다 실패 시 차단합니다
- check 블록은 지속 검증이며 유일하게 실패해도 apply를 막지 않고 경고만 남깁니다
다음 글(#8 신규 범위 집중)에서는 004의 대표 신규 범위인 ephemeral 값과 write-only 인수, 그리고 depends_on·lifecycle 메타 인수를 묶어 정리합니다.