개요

Terraform은 HashiCorp이 개발한 오픈소스 Infrastructure as Code(IaC) 도구로, 클라우드 인프라를 선언적 코드로 정의하고 관리합니다. AWS, GCP, Azure 등 주요 클라우드 프로바이더를 포함해 수천 개의 서비스를 지원하며, 인프라의 생성, 변경, 버전 관리를 코드 수준에서 제어할 수 있습니다.

핵심 개념

Terraform의 동작 원리를 이해하면 인프라를 효과적으로 관리할 수 있습니다.

  • HCL(HashiCorp Configuration Language): Terraform의 선언적 설정 언어로 인프라 리소스를 정의
  • State: 실제 인프라와 코드 사이의 매핑을 추적하는 상태 파일
  • Plan/Apply: 변경 사항을 미리 확인(plan)하고 적용(apply)하는 2단계 워크플로우
  • Module: 재사용 가능한 인프라 컴포넌트 패키지
  • Provider: AWS, GCP 등 클라우드 서비스와의 인터페이스

실전 예제

AWS에서 VPC와 EC2 인스턴스를 프로비저닝하는 예제입니다.

# providers.tf
terraform {
  required_version = ">= 1.7"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
  backend "s3" {
    bucket = "my-terraform-state"
    key    = "prod/terraform.tfstate"
    region = "ap-northeast-2"
  }
}

provider "aws" {
  region = var.aws_region
}

# variables.tf
variable "aws_region" {
  description = "AWS region"
  default     = "ap-northeast-2"
}

variable "environment" {
  description = "Environment name"
  type        = string
  default     = "production"
}

# main.tf
resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true

  tags = {
    Name        = "${var.environment}-vpc"
    Environment = var.environment
  }
}

resource "aws_subnet" "public" {
  count             = 2
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.${count.index}.0/24"
  availability_zone = data.aws_availability_zones.available.names[count.index]

  tags = {
    Name = "${var.environment}-public-${count.index}"
  }
}

resource "aws_instance" "web" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t3.micro"
  subnet_id     = aws_subnet.public[0].id

  tags = {
    Name = "${var.environment}-web-server"
  }
}

기본적인 Terraform 워크플로우입니다.

# 초기화 (프로바이더 다운로드)
terraform init

# 코드 포맷팅
terraform fmt -recursive

# 문법 검증
terraform validate

# 변경 사항 미리 확인
terraform plan -out=tfplan

# 변경 사항 적용
terraform apply tfplan

# 현재 상태 확인
terraform state list

# 특정 리소스 상세 정보
terraform state show aws_instance.web

# 리소스 삭제
terraform destroy

활용 팁

  • 원격 State 관리: 팀 환경에서는 S3 + DynamoDB를 사용하여 State를 원격 저장하고 잠금을 관리하세요. 로컬 State는 협업 시 충돌의 원인이 됩니다.
  • 모듈화: 반복되는 인프라 패턴은 모듈로 추출하세요. Terraform Registry에서 검증된 공식 모듈을 활용하면 시간을 절약할 수 있습니다.
  • 환경 분리: workspace 또는 디렉토리 구조로 dev/staging/prod 환경을 분리하세요. terraform workspace는 간단하지만, 대규모 프로젝트에서는 디렉토리 분리가 더 명확합니다.
  • Plan 리뷰 필수: apply 전에 반드시 plan 결과를 확인하세요. 특히 destroy가 포함된 변경은 각별히 주의해야 합니다.
  • tfvars로 값 분리: 환경별 변수를 .tfvars 파일로 분리하고, 민감한 값은 환경 변수나 Vault를 사용하세요.

마무리

Terraform은 인프라를 코드로 관리하는 IaC의 사실상 표준 도구입니다. 선언적 접근 방식으로 인프라의 현재 상태와 원하는 상태를 명확히 정의하고, 버전 관리와 코드 리뷰를 통해 인프라 변경의 안전성을 확보할 수 있습니다. 모듈화와 원격 State 관리를 통해 팀 단위의 효율적인 인프라 운영을 시작해보세요.