테라폼(Terraform) 완전 가이드 — IaC로 인프라를 코드처럼

1️⃣ Terraform이란?

Terraform은 HashiCorp에서 만든 IaC(Infrastructure as Code) 도구로,
인프라(서버, 네트워크, DB, IAM 등)를 선언형 구성 파일(HCL) 로 정의하고,
plan/apply 명령을 통해 실제 인프라를 자동으로 생성·변경·삭제할 수 있게 해줍니다.

Terraform은 AWS, Azure, GCP뿐 아니라
VMware, GitHub, Kubernetes, Docker 등 수백 개의 Provider를 지원하여
멀티클라우드 인프라 자동화에 최적화되어 있습니다.


2️⃣ 핵심 개념 정리

개념설명
HCL (HashiCorp Configuration Language)사람이 읽기 쉬운 선언형 문법
Provider클라우드 또는 외부 시스템을 제어하는 플러그인
Resource실제 생성되는 인프라 단위 객체 (예: aws_s3_bucket)
Data Source이미 존재하는 리소스의 정보를 가져오는 참조 데이터
Module여러 리소스를 묶은 재사용 가능한 구성 단위
State현재 인프라 상태를 저장하는 스냅샷
Lifecycle리소스 생성/삭제/변경 시 동작을 제어하는 정책

3️⃣ 간단한 예시 (AWS S3 버킷 만들기)

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_s3_bucket" "example" {
  bucket = "my-terraform-demo-bucket"
  tags = {
    Name = "DemoBucket"
    Env  = "Dev"
  }
}

output "bucket_arn" {
  value = aws_s3_bucket.example.arn
}

명령어 순서:

terraform init
terraform plan
terraform apply

4️⃣ 디렉터리 구조 예시

infra/
 ├─ modules/
 │   ├─ network/
 │   ├─ s3/
 │   └─ ecs/
 ├─ envs/
 │   ├─ dev/
 │   └─ prod/
 └─ global/
     └─ backend/

환경별(tfvars) 설정을 분리해
개발/운영 환경을 같은 코드로 관리할 수 있습니다.


5️⃣ 모듈화 베스트 프랙티스

  • 모듈은 입력(variables.tf)과 출력(outputs.tf)을 명확히 정의
  • 공통 정책(암호화, 태그, 버전 정책)을 모듈 내부에서 강제
  • 버전 태깅으로 모듈 변경 내역 관리
  • 조직 공용 모듈 저장소(Git, Terraform Registry) 운영 권장

6️⃣ 상태(State) 관리 실전 팁

  • 로컬 상태 금지, S3·GCS·Blob 등 원격 백엔드 사용
  • Drift(실제와 상태 불일치) 방지를 위해 terraform plan을 주기적으로 실행
  • 팀 협업 시 DynamoDB Lock(또는 Remote State Lock)으로 충돌 방지
  • 민감 정보(State 내 포함 주의): 비밀은 별도 Parameter Store 또는 Vault에 저장

🌐 Terraform 실전 적용 사례 — 도커 기반 웹 인프라 구축

현재 저는 Terraform을 이용해 백엔드와 프론트엔드를 모두 도커 이미지 기반으로 배포하는 환경을 운영하고 있습니다.
모든 인프라는 Terraform 코드 한 세트로 관리되며, AWS의 ECS(Fargate)와 ALB, 오토스케일링 정책을 활용해
유연하고 자동화된 웹 인프라 구조를 만들었습니다.


⚙️ 인프라 구조 요약

[사용자 요청] → [ALB (Application Load Balancer)]
                    ↓
         [ECS Service (Fargate)]
         ├─ Backend (Django API)
         └─ Frontend (Next.js)
                    ↓
          [RDS, S3, CloudFront 등 연결]

  • Terraform으로 VPC, Subnet, Security Group, ALB, ECS Cluster, 오토스케일링 정책 등을 정의
  • 백엔드 (Django) 는 Dockerfile로 빌드 → ECR에 푸시 → ECS Task Definition에서 이미지 참조
  • 프론트엔드 (Next.js) 도 Docker 이미지로 빌드 → ECR 푸시 → ECS 서비스로 실행
  • ALB 라우팅 규칙으로 /api 요청은 백엔드로, / 요청은 프론트엔드로 자동 분기

🚀 오토스케일링 & 로드밸런서 운영

  • 로드밸런서(ALB)
    • 트래픽 분산 및 SSL(ACM 인증서) 적용
    • Health Check를 통해 비정상 컨테이너를 자동 제외
  • 오토스케일링(Auto Scaling)
    • CPU, Memory 지표 기반으로 Task 자동 확장
    • 트래픽 급증 시 ECS가 자동으로 새 컨테이너를 추가
    • 부하 감소 시 자동 축소 → 효율적 비용 관리

🧱 Terraform 코드 구조 (요약)

infra/
 ├─ modules/
 │   ├─ network/
 │   ├─ ecs/
 │   ├─ alb/
 │   └─ autoscaling/
 ├─ envs/
 │   └─ prod/
 │       ├─ main.tf
 │       ├─ variables.tf
 │       ├─ outputs.tf
 │       └─ terraform.tfvars
 └─ docker/
     ├─ backend/
     └─ frontend/


🔄 배포 과정 요약

  1. Docker 이미지 빌드 및 푸시 docker build -t my-backend ./docker/backend docker build -t my-frontend ./docker/frontend docker push <ECR_URL>/my-backend:latest docker push <ECR_URL>/my-frontend:latest
  2. Terraform으로 인프라 생성 terraform init terraform plan terraform apply

🌈 결과 — 완전 자동화된 클라우드 환경

이 구성으로 인해

  • 서버 배포 및 확장이 완전 자동화되었고
  • 사용량 급증에도 오토스케일러가 컨테이너를 자동 추가
  • ALB를 통한 트래픽 분산으로 안정적인 서비스 제공

즉, Terraform 코드 한 세트로 인프라 + 애플리케이션 배포 + 확장성까지 모두 관리할 수 있게 되었습니다.


7️⃣ 워크스페이스와 브랜치 전략

  • Workspaces: 동일 코드로 dev/stg/prod 환경을 분리
  • Git 브랜치 전략: feature → PR → main 병합 시 CI에서 plan → 승인 후 apply

8️⃣ CI/CD와 보안

  • CI 파이프라인: terraform fmt, validate, tflint, tfsec 자동 검사
  • 보안정책 코드화: Sentinel / OPA / tfsec 규칙
  • 비밀 관리: Secrets Manager, SSM Parameter Store, Vault

✅ 결론

Terraform은 단순한 IaC 도구가 아니라,
“코드 한 줄로 인프라와 애플리케이션을 동시에 관리할 수 있는 자동화 플랫폼” 입니다.

백엔드와 프론트엔드가 모두 Docker 기반이라면,
Terraform을 활용해 ALB, ECS, 오토스케일러까지 함께 정의하는 것이
가장 깔끔하고 확장 가능한 클라우드 아키텍처 구현 방식입니다.

🌟 한 줄 요약:
Terraform은 인프라의 코드화를 넘어서,
“개발과 운영을 하나의 파이프라인으로 묶는” 현대적 클라우드의 핵심 도구입니다.

Posted in

댓글 남기기