구성 문법

구성 문법 (Configuration Syntax)

이 섹션의 다른 페이지들은 Terraform 언어에 등장할 수 있는 다양한 구성 요소를 설명했어요. 이 페이지는 그 언어의 저수준 문법을 더 자세히 다뤄서, 그러한 구성 요소들이 어떤 기본 조각들로 이루어져 있는지 보여줘요.

출처: 문서

본문

이 페이지는 Terraform 언어의 네이티브 문법을 설명해요. 이 문법은 사람이 읽고 쓰기에 비교적 쉽도록 설계된 풍부한 언어예요. Terraform 언어의 구성 요소들은 JSON 문법으로도 표현할 수 있는데, JSON은 사람이 읽고 편집하기는 어렵지만 프로그래밍 방식으로 생성하고 파싱하기는 더 쉬워요.

Terraform 언어의 저수준 문법은 다른 애플리케이션, 특히 다른 HashiCorp 제품들의 구성 언어에서도 사용하는 HCL이라는 문법으로 정의돼요. Terraform을 사용하기 위해 HCL 문법의 모든 세부 내용을 알 필요는 없으므로, 이 페이지에서는 가장 중요한 내용을 요약해요. 관심이 있다면 HCL 네이티브 문법 사양에서 HCL 문법의 전체 정의를 볼 수 있어요.

인자와 블록 (Arguments and Blocks)

Terraform 언어 문법은 인자(argument)와 블록(block)이라는 두 가지 핵심 문법 구성 요소를 중심으로 만들어져 있어요.

인자 (Arguments)

인자는 특정 이름에 값을 할당해요.

image_id = "abc123"

등호 앞의 식별자는 인자 이름이고, 등호 뒤의 표현식은 인자의 이에요.

인자가 나타나는 문맥에 따라 유효한 값 타입이 결정돼요 (예를 들어 각 리소스 타입은 인자 타입을 정의하는 스키마를 가져요). 하지만 많은 인자는 임의의 표현식을 받아들여서, 값을 리터럴로 지정하거나 다른 값에서 프로그래밍 방식으로 생성할 수 있어요.

참고: Terraform의 구성 언어는 HCL이라는 더 일반적인 언어에 기반하며, HCL 문서는 보통 "argument" 대신 "attribute"라는 단어를 사용해요. 이 두 단어는 이 문맥에서 서로 바꿔 쓸 수 있을 만큼 유사해요. 하지만 Terraform은 "attribute"라고 불리는 다른 것들과도 상호작용하기 때문에(특히 Terraform 리소스는 표현식에서 참조할 수는 있지만 구성에서 값을 할당할 수는 없는 id 같은 속성을 가져요), Terraform 문서에서는 이 문법 구성을 가리킬 때 "argument"를 사용하기로 해요.

블록 (Blocks)

블록은 다른 내용을 담는 컨테이너예요.

resource "aws_instance" "example" {
  ami = "abc123"

  network_interface {
    # ...
  }
}

블록은 타입(이 예시에서는 resource)을 가져요. 각 블록 타입은 타입 키워드 뒤에 몇 개의 라벨이 와야 하는지 정의해요. resource 블록 타입은 두 개의 라벨을 요구하며, 위 예시에서는 aws_instanceexample이에요. aws_instance 라벨은 AWS 프로바이더에 특화된 것으로, 구성 적용 시 Terraform이 프로비저닝하는 resource 타입을 지정해요. 두 번째 라벨은 리소스의 특정 인스턴스에 붙일 수 있는 임의의 이름이에요. 같은 블록 타입의 인스턴스를 여러 개 만들고 각 인스턴스에 고유한 이름을 부여해 구분할 수 있어요. 이 예시에서 구성 작성자는 이 aws_instance 리소스 인스턴스에 example이라는 라벨을 붙였어요.

특정 블록 타입은 필수 라벨을 여러 개 가질 수도, 중첩된 network_interface 블록 타입처럼 아예 없을 수도 있어요.

블록 타입 키워드와 라벨 뒤에는 블록 *본문(body)*이 {} 문자로 구분돼요. 블록 본문 안에는 더 많은 인자와 블록이 중첩될 수 있어서, 블록과 관련 인자의 계층 구조를 만들어요.

Terraform 언어는 제한된 수의 *최상위 블록 타입(top-level block types)*을 사용해요. 이는 구성 파일에서 다른 블록 밖에 나타날 수 있는 블록이에요. 대부분의 Terraform 기능(리소스, 입력 변수, 출력 값, 데이터 소스 등 포함)이 최상위 블록으로 구현돼요.

식별자 (Identifiers)

인자 이름, 블록 타입 이름, 그리고 리소스·입력 변수 등 대부분의 Terraform 전용 구성 요소의 이름은 모두 *식별자(identifier)*예요.

식별자는 문자, 숫자, 밑줄(_), 하이픈(-)을 포함할 수 있어요. 식별자의 첫 문자는 리터럴 숫자와의 혼동을 피하기 위해 숫자가 될 수 없어요.

완전한 식별자 규칙을 위해 Terraform은 유니코드 식별자 문법을 구현하며, 여기에 ASCII 하이픈 문자 -를 확장해 포함해요.

주석 (Comments)

Terraform 언어는 세 가지 주석 문법을 지원해요.

  • # — 한 줄 주석을 시작하며 해당 줄의 끝에서 끝나요.
  • //#의 대안으로 한 줄 주석을 시작해요.
  • /**/ — 여러 줄에 걸칠 수 있는 주석의 시작 및 끝 구분자예요.

# 한 줄 주석 스타일이 기본 주석 스타일이며 대부분의 경우 사용해야 해요. 자동 구성 포맷 도구는 이중 슬래시 스타일이 관용적이지 않으므로 // 주석을 # 주석으로 자동 변환할 수 있어요.

문자 인코딩과 줄바꿈 (Character Encoding and Line Endings)

Terraform 구성 파일은 항상 UTF-8로 인코딩되어야 해요. 언어의 구분자는 모두 ASCII 문자지만, Terraform은 식별자, 주석, 문자열 값에 비 ASCII 문자를 허용해요.

Terraform은 Unix 스타일 줄바꿈(오직 LF) 또는 Windows 스타일 줄바꿈(CR 다음 LF)을 가진 구성 파일을 모두 받아들여요. 하지만 관용적인 스타일은 Unix 규칙이며, 자동 구성 포맷 도구는 CRLF 줄바꿈을 LF로 자동 변환할 수 있어요.

더 알아보기 (Learn more)