타입과 값
타입과 값 (Types and Values)
표현식의 결과는 하나의 값(value)이에요. 모든 값은 타입(type)을 가지는데, 이 타입이 그 값을 어디에 쓸 수 있고 어떤 변환이 가능한지를 결정해 줘요. 이 문서에서는 Terraform 언어가 사용하는 다양한 값 타입과 그 표기법(리터럴)을 정리해 드릴게요.
출처: 문서
본문
타입 (Types)
Terraform 언어는 값에 대해 다음과 같은 타입들을 사용해요:
string:"hello"같은 텍스트를 나타내는 유니코드 문자들의 나열이에요.number: 숫자 값이에요.15같은 정수는 물론6.283185같은 분수 값도 표현할 수 있어요.bool:true또는false인 불리언 값이에요. 조건부 로직에 사용할 수 있어요.list(또는tuple):["us-west-1a", "us-west-1c"]같은 값들의 나열이에요. 리스트 안의 요소는 0부터 시작하는 연속된 정수로 식별해요.set: 중복되지 않는 유일한 값들의 모음으로, 별도의 식별자나 순서가 없어요.map(또는object):{name = "Mabel", age = 52}처럼 이름이 붙은 라벨로 식별되는 값들의 모음이에요.
string, number, bool은 원시 타입(primitive type)이라고 불러요. list/tuple과 map/object는 복합 타입(complex type), 구조적 타입(structural type), 또는 컬렉션 타입(collection type)이라고 불러요. 복합 타입에 대한 더 자세한 설명은 타입 제약 문서를 참고하세요.
마지막으로, 타입이 없는 특별한 값이 하나 있어요:
null: 부재 또는 생략을 나타내는 값이에요. 리소스의 인자에null을 설정하면 Terraform은 그 인자를 완전히 생략한 것처럼 동작해요. 즉 기본값이 있으면 기본값을 사용하고, 필수 인자라면 오류를 발생시켜요.null은 조건을 만족하지 않을 때 인자를 동적으로 생략할 수 있게 해주는 조건부 표현식에서 가장 유용해요.
리터럴 표현식 (Literal Expressions)
리터럴 표현식은 특정 상수 값을 직접 나타내는 표현식이에요. Terraform은 위에서 설명한 각 값 타입에 대해 리터럴 표현식 문법을 제공해요.
문자열 (Strings)
문자열은 보통 "like this"처럼 큰따옴표로 감싼 유니코드 문자 나열로 표현해요. 더 복잡한 문자열에는 "heredoc" 문법도 있어요.
문자열 리터럴은 Terraform에서 가장 복잡한 종류의 리터럴 표현식이라 별도의 문서 페이지가 있어요. 이스케이프 시퀀스, heredoc 문법, 보간(interpolation), 템플릿 지시자에 대한 내용은 문자열 문서를 참고하세요.
숫자 (Numbers)
숫자는 따옴표 없이 쓰는 숫자 나열로 표현하며, 15처럼 소수점이 있어도 없어도 돼요. 예: 15 또는 6.283185.
불리언 (Bools)
불리언은 따옴표 없이 쓰는 기호 true와 false로 표현해요.
Null
null 값은 따옴표 없이 쓰는 기호 null로 표현해요.
리스트/튜플 (Lists/Tuples)
리스트/튜플은 값들을 쉼표로 구분해 대괄호로 감싸서 표현해요. 예: ["a", 15, true].
리스트 리터럴은 가독성을 위해 여러 줄로 나눌 수 있지만 값 사이에는 항상 쉼표가 필요해요. 마지막 값 뒤의 쉼표는 허용되지만 필수는 아니에요. 리스트 안의 값은 임의의 표현식일 수 있어요.
리스트와 튜플은 허용하는 타입에 각각 제약이 달라요. 각각 허용하는 타입에 대한 자세한 내용은 튜플과 리스트 문서를 참고하세요.
집합 (Sets)
Terraform은 set이 순서가 없는 컬렉션이기 때문에 set의 요소를 인덱스로 직접 접근하는 것을 지원하지 않아요. set의 요소를 인덱스로 접근하려면 먼저 set을 list로 변환해야 해요.
set을 정의해 볼게요. 다음 예제는 example_set이라는 set 이름을 지정해요:
variable "example_set" {
type = set(string)
default = ["foo", "bar"]
}
tolist 함수를 사용해 set을 list로 변환해요. 다음 예제는 변환된 list를 example_list라는 local 변수로 저장해요:
locals {
example_list = tolist(var.example_set)
}
이제 list의 요소를 참조할 수 있어요:
output "first_element" {
value = local.example_list[0]
}
output "second_element" {
value = local.example_list[1]
}
맵/객체 (Maps/Objects)
맵/객체는 중괄호 안에 <KEY> = <VALUE> 쌍들을 나열해서 표현해요:
{
name = "John"
age = 52
}
키/값 쌍은 쉼표나 줄바꿈 중 하나로 구분할 수 있어요. 맵 안의 값은 임의의 표현식이 될 수 있어요. 맵의 키는 반드시 문자열이어야 하는데, 유효한 식별자라면 따옴표를 생략할 수 있고 그렇지 않으면 따옴표로 감싸야 해요. 괄호로 감싼 비-리터럴 문자열 표현식을 키로 사용할 수도 있어요. 예: (var.business_unit_tag_name) = "SRE".
인덱스와 속성 (Indices and Attributes)
list/tuple과 map/object 값의 요소는 local.list[3]처럼 대괄호 인덱스 표기법으로 접근할 수 있어요. 괄호 안의 표현식은 list/tuple 값이면 정수, map/object 값이면 문자열이어야 해요.
유효한 식별자인 이름을 가진 map/object 속성은 local.object.attrname처럼 점으로 구분된 속성 표기법으로도 접근할 수 있어요. 맵에 임의의 사용자 지정 키가 들어 있을 수 있는 경우에는 대괄호 인덱스 표기법(local.map["keyname"])만 사용하는 것을 권장해요.
복합 타입에 대해 더 알아보기 (More About Complex Types)
대부분의 상황에서 list와 tuple은 동일하게 동작하며, map과 object도 마찬가지예요. 구분이 필요하지 않은 경우 Terraform 문서는 각 쌍의 용어를 서로 바꿔 사용해요(역사적으로 "list"와 "map"을 선호해 왔어요).
하지만 모듈 작성자와 프로바이더 개발자는 이 비슷한 타입들(및 관련 set 타입)의 차이를 이해해야 해요. 왜냐하면 이 타입들은 입력 변수와 리소스 인자의 허용 값을 제한하는 서로 다른 방법을 제공하기 때문이에요.
이 타입들에 대한 완전한 세부사항(그리고 왜 그 차이가 보통 중요하지 않은지)은 타입 제약 문서를 참고하세요.
타입 변환 (Type Conversion)
표현식은 리소스와 하위 모듈의 인자 값을 설정하는 데 가장 자주 사용돼요. 이 경우 인자는 기대되는 타입(expected type)을 가지며, 주어진 표현식은 그 타입의 값을 생성해야 해요.
가능한 경우 Terraform은 기대 타입을 생성하기 위해 값을 한 타입에서 다른 타입으로 자동 변환해요. 이것이 불가능하면 Terraform은 타입 불일치 오류를 발생시키고, 더 적절한 표현식으로 구성을 업데이트해야 해요. 동등 연산자를 사용할 때는 자동 타입 변환이 일어나지 않아요.
Terraform은 필요할 때 number와 bool 값을 string으로 자동 변환해요. 또한 문자열이 숫자나 bool 값의 유효한 표현을 포함하고 있다면 string을 number나 bool로 변환하기도 해요.
더 알아보기 (Learn more)
- 타입 제약 (Type Constraints): 복합 타입과 타입 생성자에 대한 공식 참조
- 문자열과 템플릿 (Strings and Templates): 문자열 리터럴, 이스케이프, 보간
- 이름 있는 값 참조 (References to Named Values): 리소스 속성 참조 방법
- for 표현식 (for Expressions): 컬렉션 변환과 필터링