Terraform

인프라를 코드(HCL)로 선언하고, 클라우드 리소스의 생성·변경·삭제를 자동화하는 IaC(Infrastructure as Code) 도구입니다.

왜 필요한가

[수동 인프라 관리의 문제]
- 콘솔에서 클릭으로 서버 생성 → 재현 불가, 팀원이 모름
- 환경(개발/스테이징/프로덕션)마다 수동 반복 작업
- 설정 변경 이력 추적 불가

[Terraform]
- 코드로 인프라 선언 → Git으로 버전 관리
- 같은 코드로 여러 환경 동일하게 프로비저닝
- plan으로 변경 사항 미리 확인 후 apply

핵심 특징

기본 작동 흐름

.tf 파일 작성
    │
    ▼
terraform init      ← Provider 플러그인 다운로드
    │
    ▼
terraform plan      ← 변경 사항 미리 보기 (dry-run)
    │
    ▼
terraform apply     ← 실제 리소스 생성/변경/삭제
    │
    ▼
terraform destroy   ← 모든 리소스 삭제

HCL 문법 예시 (GCP Cloud Run)

# provider 설정
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 5.0"
    }
  }
}

provider "google" {
  project = "cslog-rtaeho"
  region  = "asia-northeast3"
}

# Cloud Run 서비스 생성
resource "google_cloud_run_v2_service" "backend" {
  name     = "cslog-backend"
  location = "asia-northeast3"

  template {
    containers {
      image = "asia-northeast3-docker.pkg.dev/cslog-rtaeho/cslog/backend:latest"

      resources {
        limits = {
          cpu    = "1"
          memory = "512Mi"
        }
      }
    }
  }
}

# 외부 접근 허용
resource "google_cloud_run_v2_service_iam_member" "public" {
  name   = google_cloud_run_v2_service.backend.name
  role   = "roles/run.invoker"
  member = "allUsers"
}

# 출력값
output "backend_url" {
  value = google_cloud_run_v2_service.backend.uri
}

핵심 블록

블록역할
terraform버전, provider 선언
provider클라우드 연결 설정
resource생성할 인프라 리소스
variable입력값 (환경별 값 분리)
output생성 후 출력할 값
data기존 리소스 참조
module재사용 가능한 코드 묶음

State 관리

[로컬 state — 개발용]
terraform.tfstate 파일을 로컬에 저장
→ 팀 협업 시 충돌 위험

[원격 state — 팀 협업]
GCS 버킷 or Terraform Cloud에 저장
→ 동시 수정 방지 (State Locking)

terraform {
  backend "gcs" {
    bucket = "cslog-terraform-state"
    prefix = "prod"
  }
}

Ansible vs Terraform

항목TerraformAnsible
목적인프라 프로비저닝서버 설정·소프트웨어 설치
방식선언형절차형
상태 관리State 파일로 추적없음
주요 대상Cloud 리소스 (VM, DB, 네트워크)OS 설정, 패키지 설치

CSLOG에서 보기