templatefile 함수

templatefile 함수

templatefile 함수는 주어진 경로의 파일을 읽고, 제공된 템플릿 변수 집합을 사용해 그 내용을 템플릿으로 렌더링해주는 내장 함수예요.

출처: 문서

본문

templatefile(path, vars)는 템플릿 문법이 기본 Terraform 언어의 문자열 템플릿(string templates)과 동일해요. ${ ... }로 구분되는 보간(interpolation) 시퀀스도 포함해요. 이 함수는 긴 템플릿 시퀀스를 가독성을 위해 별도 파일로 분리할 수 있게 해줘요.

vars 인자는 객체(object)여야 해요. 템플릿 파일 안에서는 맵의 각 키가 보간용 변수로 사용돼요. 템플릿은 Terraform 언어에서 사용 가능한 다른 함수도 사용할 수 있지만, templatefile의 재귀 호출은 허용되지 않아요. 변수 이름은 반드시 문자로 시작하고, 그 뒤에 0개 이상의 문자·숫자·밑줄이 올 수 있어요.

Terraform 언어의 문자열은 Unicode 문자 시퀀스이므로, 이 함수는 파일 내용을 UTF-8 인코딩 텍스트로 해석하고 그 결과 Unicode 문자를 반환해요. 파일에 잘못된 UTF-8 시퀀스가 포함돼 있으면 이 함수는 오류를 만들어내요.

이 함수는 Terraform 실행이 시작될 때 이미 디스크에 존재하는 파일에만 사용할 수 있어요. 함수는 의존성 그래프에 참여하지 않기 때문에, Terraform 작업 중에 동적으로 생성되는 파일에는 사용할 수 없어요.

*.tftpl은 템플릿 파일에 권장되는 이름 패턴이에요. Terraform이 다른 이름을 막지는 않지만, 이 규칙을 따르면 편집기가 내용을 이해하는 데 도움이 되고 결과적으로 더 나은 편집 경험을 제공할 가능성이 커요.

예시

리스트 (Lists)

다음 내용을 가진 템플릿 파일 backends.tftpl이 있다고 해볼게요:

%{ for addr in ip_addrs ~}
backend ${addr}:${port}
%{ endfor ~}

templatefile 함수는 이 템플릿을 다음과 같이 렌더링해요:

> templatefile("${path.module}/backends.tftpl", { port = 8080, ip_addrs = ["10.0.0.1", "10.0.0.2"] })
backend 10.0.0.1:8080
backend 10.0.0.2:8080

맵 (Maps)

다음 내용을 가진 템플릿 파일 config.tftpl이 있다고 해볼게요:

%{ for config_key, config_value in config }
set ${config_key} = ${config_value}
%{ endfor ~}

templatefile 함수는 이 템플릿을 다음과 같이 렌더링해요:

> templatefile(
               "${path.module}/config.tftpl",
               {
                 config = {
                   "x"   = "y"
                   "foo" = "bar"
                   "key" = "value"
                 }
               }
              )
set foo = bar
set key = value
set x = y

템플릿에서 JSON 또는 YAML 생성하기

생성하려는 문자열이 JSON이나 YAML 문법이라면, 개별 보간 시퀀스와 지시어(directive)를 많이 사용하면서 올바르게 해석되는 유효한 JSON이나 YAML을 생성하는 템플릿을 작성하는 건 종종 까다롭고 지루해요.

대신 아래 예시처럼 일반적인 Terraform 표현식 문법으로 값을 지정하면서, jsonencode 또는 yamlencode에 대한 단일 보간 호출만으로 구성된 템플릿을 작성할 수 있어요:

${jsonencode({
  "backends": [for addr in ip_addrs : "${addr}:${port}"],
})}

${yamlencode({
  "backends": [for addr in ip_addrs : "${addr}:${port}"],
})}

앞 섹션의 backends.tftpl 예시와 같은 입력이 주어지면, 이렇게 하면 이스케이프나 구분자를 수동으로 처리하지 않아도 주어진 데이터 구조의 유효한 JSON 또는 YAML 표현이 생성돼요.

위 최신 예시들에서 ip_addrs 요소에 기반한 반복은 template 지시어 대신 for 표현식을 사용해 이뤄져요.

{"backends":["10.0.0.1:8080","10.0.0.2:8080"]}

결과 템플릿이 작다면, 메인 설정 파일에 jsonencodeyamlencode 호출을 인라인으로 작성하고 별도의 템플릿 파일을 만들지 않을 수도 있어요:

locals {
  backend_config_json = jsonencode({
    "backends": [for addr in ip_addrs : "${addr}:${port}"],
  })
}

자세한 내용은 jsonencodeyamlencode의 메인 문서를 참고하세요.

관련 함수

  • file 함수는 디스크에서 파일을 읽어 템플릿 해석 없이 그 리터럴 내용을 반환해요.
  • templatestring 함수는 템플릿을 담은 문자열 값에 대한 간단한 참조를 받아 그 내용을 렌더링해요.

더 알아보기 (Learn more)