try 함수
try 함수
try 함수는 모든 인자 표현식을 차례로 평가해서 오류를 만들지 않는 첫 번째 표현식의 결과를 돌려줘요. 구현 시점에 형태가 잘 알려지지 않은 복잡한 데이터 구조를 다룰 때 특히 유용한 함수예요. try는 런타임에 알 수 없는 데이터 접근에서 발생하는 동적 오류만 처리할 수 있어요.
출처: 문서
본문
try는 모든 인자 표현식을 차례로 평가해서 오류를 만들지 않는 첫 번째 표현식의 결과를 돌려줘요.
이 함수는 인자를 평가할 때 발생하는 오류를 잡을 수 있는 특별한 함수예요. 구현 시점에 형태가 잘 알려지지 않은 복잡한 데이터 구조를 다룰 때 특히 유용해요.
예를 들어 외부 시스템에서 JSON이나 YAML 형식으로 가져온 데이터를 디코딩하면, 결과에 설정된다는 보장이 없는 속성이 있을 수 있어요. try를 사용해 예측 가능한 타입을 가진 정규화된 데이터 구조를 만들어 구성의 다른 곳에서 더 편리하게 사용할 수 있어요:
locals {
raw_value = yamldecode(file("${path.module}/example.yaml"))
normalized_value = {
name = tostring(try(local.raw_value.name, null))
groups = try(local.raw_value.groups, [])
}
}
위 로컬 값 표현식을 사용하면, 모듈의 다른 곳의 구성이 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는 정규화를 수행하는 특별한 로컬 값에서만 사용하기를 강력히 권장해요. 그래야 오류 처리가 모듈의 한 위치에 모이고, 모듈의 나머지는 정규화된 구조를 단순하게 참조할 수 있어서 미래의 유지보수자에게 더 읽기 쉽게 만들 수 있거든요.
try 함수는 런타임까지 알 수 없는 데이터 접근에서 발생하는 동적 오류만 잡고 처리할 수 있어요. 잘못된 리소스 참조처럼 어떤 입력에 대해서도 유효하지 않은 것으로 증명될 수 있는 표현식 관련 오류는 잡지 못해요.
경고: try 함수는 객체 속성의 존재와 타입을 간결하게 테스트하기 위한 것만 의도해요. 기술적으로는 어떤 종류의 표현식도 받을 수 있지만, 위 예제처럼 단순한 속성 참조와 타입 변환 함수에만 사용하기를 권장해요. try를 과도하게 사용해 오류를 억누르면 이해하고 유지보수하기 어려운 구성이 돼요.
예시
> 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.
관련 함수
can- 표현식을 평가해 보고 성공했는지 여부를 나타내는 불리언 값을 돌려줘요.
더 알아보기 (Learn more)
- can 함수 - 표현식 평가 성공 여부를 확인해요.
- Terraform 함수 목록 - 모든 함수를 확인해 보세요.