Terraform을 활용한 본격적인 인프라를 구성에 앞서,
TF 파일 작성을 위한 문법 및 구성 요소, 사용법에 대해 정리해보려 한다.

사진과 같이 다양한 블록들이 있다. 그중 가장 많이 사용하게 되는 것들을 위주로 설명해보려한다.
terraform {
required_version = ">= 1.8.0" # terraform 버전
required_providers { # provider 버전
aws = {
source = "hashicorp/aws"
version = "~> 5.45.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = ">= 2.99.0"
}
}
}
">= 1.0.0" : 테라폼 v1.0.0 이상 모든 버전 허용
"~> 1.0.0" : 테라폼 v1.0.0 포함 ~ v1.0.x 버전 허용, v1.x.x 비허용
">= 1.0 < 2.0.0" : 테라폼 v1.0.0 이상 v2.0.0미만 버전 허용
ex)
required_providers { # provider 버전
aws = {
source = "hashicorp/aws"
version = "~> 5.45.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = ">= 2.99.0"
}
}
State (상태 파일)
- 테라폼은 State의 데이터를 사용해 코드로 관리된 리소스를 탐색 및 추적
- 민감한 정보 포함(PW, 인증서 정보..) -> State 접근 제어 필요!
- State 관리시, lock.info 파일 생성으로 잠금 처리 -> 동시 사용 제한
- 벡엔드 전환 = State 관리 저장소 선택
- 벡엔드 변경시 terraform init 으로 State 위치 재설정 필요
ex)
backend "local" {
path = "state/terraform.tfstate"
}
resource "<프로바이더이름_리소스 유형>" "<이름>" {
<인수> = <값>
}
resource "local_file" "abc" { # local 파일
content = "123!"
filename = "${path.module}/abc.txt"
}
resource "aws_instance" "web" { # aws ec2 인스턴스
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
}
ex)
resource "local_file" "abc" {
content = "123!"
filename = "${path.module}/abc.txt"
}
resource "local_file" "def" {
content = local_file.abc.content # 암시적 종속성 발생
filename = "${path.module}/def.txt"
}
resource "local_file" "xyz" {
depends_on = [ # 명시적 종속성 발생
local_file.abc
]
content = "789!"
filename = "${path.module}/xyz.txt"
}
수명주기 옵션 인수
create_before_destroy (bool) : 리소스 수정시 신규 리소스 우선 생성 후 기존 리소스 삭제
prevent_destroy (bool) : 해당 리소스 삭제(destroy)시 명시적으로 거부
ignore_changes (list) : 리소스 요소에 선언된 인수 변경사항을 테라폼 실행 시 무시
precondition : 리소스 요소에 선언된 인수의 조건 검증
postcondition : plan 과 apply 이후 결과를 속성 값으로 검증
ex)
resource "local_file" "abc" {
content = "123!"
filename = "${path.module}/abc.txt"
lifecycle {
create_before_destroy = true # 신규 리소스 생성후 기존 리소스 삭제
}
}
출처 : [한빛미디어] 테라폼으로 시작하는 IaC