Terraform - HCL 기초문법

현시기얌·2022년 1월 24일

Terraform

목록 보기
4/6

HCL Syntax

resource "aws_vpc" "main" {
  cidr_block = var.base_cidr_block
}


<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
  # Block body
  <IDENTIFIER> = <EXPRESSIONS> # Argument
}

첫번째 지시어 = Block Type
두번째 지시어 = Block Type이 지원하는 Label (1개 or 0개 이상)
ex) resource "리소스 종류" "리소스 이름"

Key Value 형태의 변수 값을 지정한다.
ex) cidr_block = var.base_cidr_block

Terraform 이 지원하는 Block 종류

terraform, provider, resource, data, module, local, variable, output

Terraform 파일 구조

디렉토리 내에 .tf 파일을 작성하게 되는데 tf파일은 HCL 문법을 따르지만 .JSON 확장자를 이용하여 json으로도 이용가능하다.

Terraform 으로 init, plan, apply 명령을 하게 되면 현재 사용자의 디렉토리 상에서 .tf파일과 .tf.json 파일을 찾게 되는데 하위 디렉토리에 대해서는 탐색을 하지 않는다.

tf 파일을 작성할 때는 인코딩을 항상 UTF-8로 설정해야 한다.

tf 파일을 가지고 있는 디렉토리를 Module이라고 부른다.
Module은 또한 Root Module과 Child Module로 나뉜다.

위의 그림처럼 디렉토리에 a,b,c 디렉토리(모듈)가 있고 c모듈이 a,b 모듈을 가져다 쓴다고 했을 때 c에서 terraform apply를 수행하게 된다고 하면 c라는 워크스페이스는 root 모듈이 되고 c가 사용하는 a,b 모듈은 child 모듈이 된다.

하지만 c에서 terraform apply하는 것이 아니라 a에서 terraform apply를 한다면 a가 root 모듈이 된다.

Arguments 와 Block

Block의 Label을 작성할 때 그 Label의 값을 Identifiers라고 하는데 제약사항이 존재한다.
Identifiers에 들어올 수 있는 값은 문자열, 숫자, _, - 이렇게 4가지다.
하지만 Identifiers에는 처음에 숫자가 들어올 수 없다.

Style Conventions

  1. Indent는 tab이 아닌 two space다.
  2. Block 내에 여러 Arguments를 정의할 때는 = 을 기준으로 key와 value를 정의한다.
  3. Resource를 정의할 때는 meta-argument들이 있는데 count, for each는 머리 부분에 위치하는 것을 선호하고 lifecycle이나 depends on은 하단부에 위치하는 것을 선호한다.

terraform fmt -diff

terraform fmt -diff 명령어를 사용하면 tf 파일에 작성된 코드들을 컨벤션에 맞게 알맞게 수정해준다.

profile
현시깁니다

0개의 댓글