표현식 — HCL 안에서 값 만들고 계산하기
표현식 — HCL 안에서 값 만들고 계산하기
드디어 하나의 값을 다른 값으로 만들어내는 표현식(expression) 차례예요. 가장 단순한 표현식은 "hello"나 5 같은 리터럴 값이지만, Terraform 언어는 그보다 훨씬 복잡한 표현식도 지원해요. 리소스가 내보낸 데이터를 참조하거나, 산술 연산을 하거나, 조건에 따라 값을 고르거나, 내장 함수를 호출하는 것까지요.
출처: https://developer.hashicorp.com/terraform/language/expressions
본문
표현식이 쓰이는 곳
표현식은 Terraform 언어의 여러 곳에서 쓰여요. 다만 어떤 문맥은 사용할 수 있는 표현식을 제한하기도 해요. 예를 들어 특정 타입의 리터럴만 요구하거나, 리소스 속성 참조를 금지하기도 하죠. 각 언어 기능의 문서에는 그 기능이 표현식에 어떤 제한을 두는지 설명돼 있어요.
표현식의 동작을 직접 실험해 보고 싶다면 terraform console 명령으로 Terraform 표현식 콘솔을 실행하면 돼요.
표현식 문법의 구성 요소
이 섹션의 다른 페이지들이 표현식 문법의 기능을 하나씩 설명해요. 큰 그림을 먼저 잡고 각 페이지를 살펴보는 걸 추천해요.
- 타입과 값(Types and Values) — 표현식이 해석되는 데이터 타입과 그 타입 값의 리터럴 문법
- 문자열과 템플릿(Strings and Templates) — 문자열 리터럴 문법, 보간 시퀀스와 템플릿 지시어
- 값 참조(References to Values) — 변수나 리소스 속성 같은 이름 있는 값을 참조하는 방법
- 연산자(Operators) — 산술·비교·논리 연산자
- 함수 호출(Function Calls) — Terraform 내장 함수 호출 문법
- 조건부 표현식(Conditional Expressions) — bool 조건에 따라 두 값 중 하나를 고르는
<CONDITION> ? <TRUE VAL> : <FALSE VAL>표현식 - For 표현식(For Expressions) —
[for s in var.list : upper(s)]처럼 복잡한 타입의 값을 다른 복잡한 타입으로 변환 - 스플랫 표현식(Splat Expressions) —
var.list[*].id처럼 복잡한 표현식에서 더 단순한 컬렉션을 뽑아내기 - 동적 블록(Dynamic Blocks) — 리소스나 다른 구성 안에서 반복 가능한 중첩 블록을 여러 개 생성
- 구성 검증(Validate) — 변수 조건, check 블록, 리소스의 전제 조건(precondition)·사후 조건(postcondition) 확인
- 타입 제약(Type Constraints) — 타입의 값이 아니라 타입 자체를 가리키는 문법. 입력 변수가
type인자에 쓰는 문법 - 버전 제약(Version Constraints) — 허용되는 소프트웨어 버전 집합을 정의하는 특수 문자열. Terraform이 여러 곳에서 사용
표현식은 결국 '값'이라는 점
표현식을 처음 배울 때 헷갈리는 포인트가 하나 있어요. 표현식은 새 값을 만들고 계산하는 것이지, 그 자체로 상태를 바꾸는 동작이 아니라는 점이에요. 예를 들어 upper("hello") 함수 호출은 "HELLO"라는 새 문자열을 만들 뿐, 아무것도 수정하지 않아요. 그래서 표현식은 항상 '결과값'으로 평가되고, 그 결과를 변수에 넣거나 리소스 인자에 넘기는 식으로 쓰는 거예요.
많은 표현식을 의도적으로 조합하면 구성이 훨씬 간결해져요. 예를 들어 for 표현식으로 목록을 변환한 뒤 [ * ] 스플랫으로 ID만 뽑아내는 식으로, 복잡한 데이터 가공을 몇 줄로 끝낼 수 있어요. 다만 표현식이 너무 복잡해지면 오히려 읽기 어려워지니, for 표현식 페이지에서 소개하는 패턴처럼 목적이 분명한 조합을 사용하는 걸 권장해요.