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/
🔄 배포 과정 요약
- 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 - 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은 인프라의 코드화를 넘어서,
“개발과 운영을 하나의 파이프라인으로 묶는” 현대적 클라우드의 핵심 도구입니다.

댓글 남기기