기본 문법 및 파일 구조

LizzyLee·2025년 1월 17일

Terraform

목록 보기
2/6

📖학습 목표

✏️ 테라폼의 작업 흐름도를 파악하자.
✏️ 테라폼의 기본 문법 및 파일 구조를 알아보자.


📢 작업 흐름

테라폼의 작업 흐름은 크게 다섯 가지 단계로 이루어진다. 각 단계는 순차적으로 수행된다.

  • Scope: 어떤 클라우드 리소스가 필요한지 구상 및 계획하는 단계
  • Author: 계획에 따라 코드를 작성하는 단계
  • Initialize: 클라우드 제공자 플러그인 및 기타 필요 모듈을 다운로드 하는 단계로 환경 구성 설정을 하는 단계로 이해할 수 있다.
  • Plan: 작성된 코드를 적용했을 때 어떠한 변화가 나타나는지 미리보기 버전을 보여주는 단계
  • Apply: 작성된 코드를 클라우드에 적용하여 리소스를 생성/수정/삭제하는 단계

일반적인 프로세스를 개괄적으로 설명하자면,
1. 클라우드 아키텍쳐 설계
2. 아키텍쳐 기반 코드 작성
3. terraform init 을 실행하여 필요한 라이브러리 다운로드
4. terraform plan 을 실행하여 코드 적용 시 발생하는 변화 미리보기 (생략해도 되지만 강력하게 권장되는 단계이다.)
5. terraform apply 를 실행하여 실제 클라우드에 코드 적용

로 이루어진다고 볼 수 있겠다. 😁


📢 기본 문법

테라폼에서는 아래와 같은 형식을 통해 리소스를 생성하거나 변수를 만들어 사용 할 수 있다.

// 포맷 
<type> <label> <name> {
	Identifier: Expression # comments 
}

// 예시 
resource "google_compute_network" "default" {
	name                    = "mynetwork"
    auto_create_subnetworks = false
}

구성 요소

  • Block: <type> <label> <name> 부분을 Block 이라고 일컫는다. 이 Block 을 정의하여 해당 아이템의 타입 및 이름을 정할 수 있다.

    • type:
      • 해당 항목의 type 을 말한다.
      • 예시로는 resource, variable, output 가 있다.
    • label:
      • type 이 resource 일 때 사용한다.
      • 해당 리소스가 어떤 서비스를 이용하는지 정의하는 곳이다.
      • 예시로는 google_compute_network, google_storage_bucket_object, google_storage_bucket 가 있다. 라벨값은 각 클라우드 provider 마다 상이하므로 공식 문서를 참고하여 작성해야 한다.
    • name: 해당 항목의 이름을 정의 할 수 있는 부분이다.
  • Identifier: 옵션값의 키를 지정할 수 있다.

  • Expression: 해당 키의 값을 지정할 수 있다.

예시 설명

// 예시 
resource "google_compute_network" "default" {
	name                    = "mynetwork"
    auto_create_subnetworks = false
}

예시의 경우 type 을 resource label 을 google_compute_network, name 을 default 로 지정하여 GCP VPC 를 생성하고 이를 문서 내에서 default 라는 이름으로 지정하였다. 그러나 Identifier 와 Expression 을 통해 실제 리소스 이름은 mynetwork 로 지정하였다.

즉, 콘솔에서 확인 시 이 리소스의 이름은 mynetwork 가 된다. 다만 테라폼 내에서 해당 리소스를 호출하여 사용하는 경우 default 라는 이름을 사용해야 한다.

이 부분은 뒤에서도 계속 반복해서 나올 예정이니 이해가 되지 않아도 넘어가자. 😇


📢 파일 구조

테라폼은 .tf 라는 확장자를 사용한다. 모든 항목을 한 개의 .tf 파일에 작성 할 수 있지만 코드를 보다 효율적으로 관리하기 위해서는 각 항목의 타입별로 문서를 생성하여 관리하는 것이 권장된다.

-- main.tf 
-- providers.tf 
-- variables.tf 
-- outputs.tf 
-- terraform.tfstate
-- terraform.tfvars 

main.tf

리소스를 정의할 때 사용하는 파일. 코드가 너무 길어지는 경우 각 리소스 타입(예: instance, buckets, ...) 별로 파일을 나눌 수 있다.

//예시
resource "google_storage_bucket" "example-bucket" {
	name 		= "mybucket" 
    location    = "US"
}

resource "google_compute_instance" "example-instance" {
    name         = "company_us_web"
    machine_type = "e2-medium"
    zone         = "us-central1-a"
  	// 이하 생략 
}

providers.tf

클라우드 제공자를 정의한다. 코드 실행 시 테라폼이 이 파일 또는 provider 항목에서 정의하는 클라우드 제공자를 참고하여 올바른 플러그인을 설치한다.

provider 로 시작하는 설정값 항목은 각 클라우드 제공자마다 상이할 수 있다.

version 값을 지정하여 특정 버전의 플러그인을 다운로드 받을 수 있다. 값이 비어있는 경우 가장 최신 플러그인을 다운로드 한다.

//예시
terraform {
	required_providers {
		google = {
			source = "hashicorp/google"
  			version = "4.23.0" // optional but recommended 
		}
	}
}

provider "google" {
	project = "project_id_12345"
  	region = "us-central1"
}

variables.tf

변수를 지정하여 소스 코드를 변경하지 않고 쉽게 커스터마이징 할 수 있다. 프로그래밍에서 파라미터를 지정하는 것과 유사하다.

//예시
variable "project_id" {
  description = "프로젝트 ID"
  type        = string
}

outputs.tf

main.tf 파일을 통해 생성된 리소스의 값을 output value 로 지정하여 다른 파일에서 이 값을 불러올 수 있다. 프로그래밍에서 리턴값을 지정하는 것과 유사하다.

//예시
//// main.tf 
resource "google_storage_bucket" "example-bucket" {
	name 		= "mybucket" 
    location    = "US"
}

//// output.tf 
output "gcs_bucket_name" {
  description = "gcs bucket name"
  value       = google_storage_bucket.example-bucket.name // main.tf 에서 값을 참고한다! 
}

terraform.tfstate

리소스 현황에 대한 정보를 저장하고 있는 파일이다. 자동으로 생성되는 파일이므로 수정하거나 삭제하는 것을 비권장한다.

기본값으로 로컬에 저장되지만 Github 나 Storage 와 같은 리모트 저장소에 올릴 수도 있다. 작업자가 다수일 경우 리모트 저장소를 사용하는 것이 권장된다.


📢 Basic Commands

테라폼 사용시 사용하는 주요 커맨드는 다음과 같다.

# 클라우드 제공자의 플러그인을 다운로드 할 때 사용
terraform init

# 테라폼 코드를 통해 실행되는 작업의 미리보기를 보기 위해 사용 
terraform plan 

# 테라폼 코드를 실제 클라우드에 적용 시키기 위해 사용 
terraform apply 

# 테라폼 리소스를 삭제하기 위해 사용 
terraform destroy 

# 테라폼 코드의 포맷을 자동으로 맞추기 위해 사용 
terraform fmt 

실행 결과 예시

각 명령어 별 실행 결과 예시는 아래와 같다.

terraform init

terraform plan

  • 전체가 아닌 변경이 필요한 부분만 변경
  • + , - 기호로 추가/삭제 표현
  • -/+ 기호로 리소스 삭제 후 재구성 함을 표현
  • terraform plan -out static_ip 으로 해당 plan 을 파일에 아카이브하여 추후 terraform apply "static_ip 커맨드를 통해 static_ip 파일을 apply 할 수 있음. 이 경우 테라폼이 terraform apply 실행 시 해당 파일에 아카이브된 changes 들만 일어나는지 확인 후 진행하게 된다.

terraform apply

terraform destroy

PoC 와 같은 개발 환경의 경우 temp 환경을 구성 할 때가 있다. 이 경우 모든 리소스를 일괄 삭제하기 위하여 terraform destroy 커맨드를 사용 할 수 있다.


📢 Terraform Validator

테라폼으로 리소스를 생성하는 경우 인적 오류로 인하여 해당 리소스가 클라우드 상에서 설정한 조직의 보안 정책과 상이 할 수 있다. 이를 사전에 방지하기 위하여 Terraform Validator 를 사용 할 수 있다.

Terraform Validator 는 terraform plan 실행 후 해당 plan 이 조직 정책과 상이한지 검사해주는 도구이다. 구체적으로는gcloud beta terraform vet 커맨드를 통해 실행되며 이 커맨드가 Google Cloud API 를 호출하여 프로젝트에 대한 데이터를 추출함으로서 검증이 진행된다.

이는 terraform 에서 제공하는 terraform validate 명령어와 상이하므로 주의해야한다. 이 명령어는 테라폼 문법과 설정값 구조를 검사하기 위한 목적으로 사용되기 때문이다.


💡 terraform validate VS Terraform Validator (for GCP)

  • terraform validate : 테라폼 문법 및 설정값 구조 검증하기 위해 사용
  • Terraform Validator (for GCP): 테라폼을 통해 생성하려는 리소스가 GCP 환경 내에 설정한 조직 정책을 위반하는지 여부를 검사하기 위해 사용

참고자료

리소스 생성(+)

리소스 업데이트(~)

리소스 삭제 후 재생성(-/+)하여 업데이트

리소스 삭제(-)

0개의 댓글