Terraform은 오픈소스 IaaC툴이며, 이를 위해 자체 Configuration 언어인 Terraform Language를 사용한다.
Terraform Language Elements
resource "aws_vpc" "main" {
cidr_block = var.base_cidr_block
}
<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
# Block body
<IDENTIFIER> = <EXPRESSION> # Argument
}
- Blocks: 컨테이너의 역할을 수행하며, 리소스 등 특정 개체의 설정을 나타낸다.
- block type: 모든 블록은 타입을 갖는다.
- labels: 타입에 따라 라벨의 갯수가 정해진다.
- body: 다른 Argument와 블록이 중첩될 수 있다.
- Arguments: name에 value를 할당하며, block 안에 존재한다.
- Expressions: 참조/조합되거나 그 자체로 어떤 값이 된다.
Modules
- Module이란 여러 개의 구성 파일(
.tf
또는.tf.json
)이 한 디렉토리에 모인 것을 말한다. - 모듈은 같은(top) 레벨의 파일들만으로 구성되며, 하위 디렉토리는 별개의 모듈로 취급되어 구성에 자동으로 포함되지 않는다.
- Terraform은 항상 하나의 root module 컨텍스트에서 실행되며, Terraform 구성(configuration)은 root 모듈과 그 child 모듈(root모듈이 호출한 모듈과 그 child)들의 트리 형태이다.
module
블록을 통해 child 모듈을 호출할 수 있으며, 아래와 같은 argument를 갖는다.source
: child module의 configuration file path 또는 다운로드 주소version
: child module 버전- input variables
- meta-arguments: child 모듈을 호출하는 방식을 지정해줄 수 있다.
Resources
- Terraform Language에서 가장 중요한 요소
- 각 Resource 블록은 타입과 로컬 네임, 2개의 라벨을 가지며, 타입과 리소스의 조합은 각 resource의 id로 작용하므로 같은 모듈에서 unique해야 한다.
- 로컬 네임은 같은 모듈 스코프에서 해당 리소스를 참조하는데 사용된다.
Meta-arguments
depends_on
: 의존성 명시count
: 특정 갯수의 인스턴스를 생성(for_each와 동시 사용 불가)for_each
: map 또는 string set으로 다수의 인스턴스를 생성(count와 동시 사용 불가)provider
: non-default provider configuration 지정lifecycle
: 리소스의 생성/소멸 관련 조건 지정provisioner
: resource 생성 후 별도 행동
Resource Behavior
- Resource 블록을 통해 새로운 객체가 생성될 경우, 해당 객체의 id가 Terraform state에 저장되어 관리된다.
- 이미 state에 존재하는 Resource 블록이 있을 경우, configuration과 객체를 비교하여 필요시 객체를 configuration에 맞게 update한다.