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.
  • can 함수는 표현식 평가를 시도하고 성공했는지 여부를 나타내는 불리언 값을 반환해요.

더 알아보기 (Learn more)