try 함수
try 함수 (try Function)
try 함수는 모든 인자 표현식을 차례로 평가해서, 오류가 나지 않는 첫 번째 표현식의 결과를 반환해요. 어떤 값이 항상 존재한다고 보장하기 어려운 복잡한 데이터를 다룰 때 유용하답니다.
출처: Packer 공식 문서
본문
try 함수는 모든 인자 표현식을 차례로 평가해, 오류를 만들어내지 않는 첫 번째 결과를 반환해요.
이 함수는 인자 평가 중 발생하는 오류를 잡아낼 수 있는 특수 함수예요. 구현 시점에 형태(shape)가 잘 알려지지 않은 복잡한 데이터 구조를 다룰 때 특히 유용해요.
예를 들어 외부 시스템에서 가져온 데이터를 JSON이나 YAML 형식으로 디코딩하면, 결과에 항상 설정되어 있다고 보장할 수 없는 속성들이 있을 수 있어요. try 를 사용해서 예측 가능한 타입을 가진 정규화된(normalized) 데이터 구조를 만들 수 있고, 그 구조를 구성의 다른 곳에서 더 편리하게 사용할 수 있어요.
locals {
raw_value = yamldecode("${path.folder}/example.yaml")
normalized_value = {
name = tostring(try(local.raw_value.name, null))
groups = try(local.raw_value.groups, [])
}
}
위 local 값 표현식 덕분에, 폴더의 다른 구성에서는 local.normalized_value 속성을 참조할 때 빠진 속성을 반복적으로 확인하고 처리할 필요가 없어요.
try 는 값이 두 가지 다른 형태로 제공될 수 있는 상황에서도 유용해요. 가장 일반적인 형태로 정규화할 수 있거든요.
variable "example" {
type = any
}
locals {
example = try(
[tostring(var.example)],
tolist(var.example),
)
}
위 코드는 var.example 가 리스트이거나 단일 문자열일 수 있게 해요. 단일 문자열이라면 그 문자열을 포함하는 단일 요소 리스트로 정규화돼요. 그래서 구성의 다른 표현식들은 local.example 가 항상 리스트라고 가정할 수 있어요.
이 두 번째 예시에는 둘 다 실패할 수 있는 두 개의 표현식이 있어요. 예를 들어 var.example 이 {} 로 설정되면 문자열이나 리스트 어느 쪽으로도 변환될 수 없어요. try 가 주어진 모든 표현식을 하나도 성공하지 않고 모두 소진하면, 마주친 모든 문제를 설명하는 오류를 반환해요.
try 는 정규화를 수행하는 특수한 local 값에서만 사용할 것을 강력히 권장해요. 그래야 오류 처리가 폴더의 한 위치에 국한되고, 나머지 폴더는 정규화된 구조에 대한 단순한 참조를 사용해서 유지보수하는 사람이 더 읽기 쉽게 되거든요.
try 함수는 런타임까지 알 수 없는 데이터 접근에서 발생하는 동적(dynamic) 오류만 잡을 수 있어요. 어떤 입력에 대해서도 무효임이 증명될 수 있는 표현식(예: 잘못된 리소스 참조)과 관련된 오류는 잡지 못해요.
경고: try 함수는 객체 속성의 존재와 타입을 간결하게 테스트하기 위한 목적으로만 쓰는 게 좋아요. 기술적으로는 어떤 종류의 표현식이든 받을 수 있지만, 위 예시처럼 단순한 속성 참조와 타입 변환 함수에만 사용하는 걸 권장해요. 오류를 억제하는 데 try 를 과도하게 쓰면 이해하기도 유지보수하기도 어려운 구성이 돼요.
Examples (예시)
> local.foo
{
"bar" = "baz"
}
> try(local.foo.bar, "fallback")
baz
> try(local.foo.boop, "fallback")
fallback
try 함수는 동적 표현식 평가 전에도 무효임이 증명될 수 있는 구조(예: 잘못된 참조나 선언되지 않은 최상위 객체에 대한 참조)와 관련된 오류는 잡지 못해요.
> try(local.nonexist, "fallback")
Error: Reference to undeclared local value
A local value with the name "nonexist" has not been declared.
Related Functions (관련 함수)
can함수는 표현식 평가를 시도하고 성공했는지 여부를 나타내는 불리언 값을 반환해요.
더 알아보기 (Learn more)
- 이 페이지는 Packer 공식 문서에서 가져왔어요.