Splat 표현식
Splat 표현식 (Splat Expressions)
splat 표현식은 for 표현식으로도 수행할 수 있는 일반적인 연산을 더 간결하게 표현하는 방법을 제공해요.
출처: 문서
본문
기본 사용법
var.list가 모두 id 속성을 가진 객체들의 리스트라면, 다음 for 표현식으로 id들의 리스트를 만들 수 있어요:
[for o in var.list : o.id]
이것은 다음 splat 표현식과 동일해요:
var.list[*].id
특별한 [*] 기호는 왼쪽에 주어진 리스트의 모든 요소를 반복하며, 각 요소에서 오른쪽에 주어진 속성 이름에 접근해요. splat 표현식은 연산 시퀀스를 기호 오른쪽으로 확장해 복합 타입 리스트에서 속성과 인덱스에 접근할 때도 사용할 수 있어요:
var.list[*].interfaces[0].name
위 표현식은 다음 for 표현식과 동일해요:
[for o in var.list : o.interfaces[0].name]
맵과 함께 쓰는 Splat 표현식
위에서 보여준 splat 표현식 패턴은 리스트, 집합, 튜플에만 적용돼요. 맵이나 객체 값으로 비슷한 결과를 얻으려면 for 표현식을 사용해야 해요.
for_each 인자를 사용하는 리소스는 표현식에서 객체의 맵으로 나타나므로 이런 리소스에는 splat 표현식을 사용할 수 없어요. 자세한 내용은 resource 블록 참조의 for_each 문서를 참고하세요.
단일 값을 리스트로 다루기 (Single Values as Lists)
splat 표현식은 list, set, tuple이 아닌 값에 적용할 때 특별한 동작을 해요.
값이 null이 아닌 경우 splat 표현식은 그 값을 단일 요소 리스트(더 정확히는 단일 요소 튜플 값)로 변환해요. 값이 null이면 splat 표현식은 빈 튜플을 반환해요.
이 특별한 동작은 값이 없음을 나타내기 위해 기본값이 null인 선택적 입력 변수를 받아들이는 모듈에 유용해요. 이를 통해 모듈이 컬렉션과 함께 작동하도록 설계된 Terraform 언어 기능에 맞게 변수 값을 적응시킬 수 있어요. 예를 들어:
variable "website_setting" {
type = object({
index_document = string
error_document = string
})
default = null
}
resource "aws_s3_bucket" "example" {
# ...
dynamic "website" {
for_each = var.website_setting[*]
content {
index_document = website.value.index_document
error_document = website.value.error_document
}
}
}
위 예제는 컬렉션 값에 기반해 0개 이상의 중첩 블록을 생성하는 dynamic 블록을 사용해요. 입력 변수 var.website_setting은 null일 수 있는 단일 객체로 정의되므로, dynamic 블록의 for_each 표현식은 [*]를 사용해 모듈 호출자가 website 인자를 설정하면 블록이 하나 생성되고, null로 남겨두면 블록이 0개 생성되도록 해요.
splat 표현식의 이런 특별한 동작은 익숙하지 않은 독자에게는 명확하지 않으므로, for_each 인자와 컬렉션을 다룬다는 문맥이 함축된 유사한 상황에서만 사용하는 것을 권장해요. 그렇지 않으면 미래의 독자에게 표현식의 의미가 불분명할 수 있어요.
레거시(속성 전용) Splat 표현식
이전 버전의 Terraform 언어에는 약간 다른 버전의 splat 표현식이 있었고, Terraform은 하위 호환성을 위해 계속 지원해요. 이 오래된 변형은 위에서 설명한 현대적 형태보다 덜 유용하므로 새 구성에서는 사용하지 않는 것을 권장해요.
레거시 "속성 전용" splat 표현식은 [*] 대신 .* 시퀀스를 사용해요:
var.list.*.interfaces[0].name
이 형태는 미묘하게 다른 동작을 가지며, 다음 for 표현식과 동일해요:
[for o in var.list : o.interfaces][0].name
속성 전용 splat 표현식에서는 인덱스 연산 [0]이 반복의 일부가 아니라 반복 결과에 적용되는 점에 주목하세요. 속성 조회만 입력의 각 요소에 적용돼요. 이 제한은 이전 버전 Terraform을 사용하는 일부 사람들을 혼란스럽게 했으므로, 더 일관된 동작을 위해 항상 [*]를 사용하는 새 스타일 splat 표현식을 쓰는 것을 권장해요.
더 알아보기 (Learn more)
- for 표현식 (for Expressions): 컬렉션 변환과 그룹화
- dynamic 블록 (dynamic Blocks): 동적 중첩 블록 생성
- 이름 있는 값 참조 (References): 리소스 속성 접근
- 타입과 값 (Types and Values): 컬렉션 타입 이해