개요
Terraform은 HashiCorp가 개발한 Infrastructure as Code (IaC) 도구로, 클라우드 인프라를 **선언적 코드(HCL)**로 정의하고 프로비저닝합니다. AWS, GCP, Azure 등 3,000+ 프로바이더를 지원하는 사실상 IaC 업계 표준입니다.
- 개발: HashiCorp (Mitchell Hashimoto)
- 출시: 2014년
- 언어: HCL (HashiCorp Configuration Language)
- 작성 언어: Go
- 라이선스: BSL 1.1 (2023년 MPL → BSL 변경)
- 웹사이트: https://terraform.io
- 오픈소스 포크: OpenTofu (Linux Foundation)
핵심 개념
| 개념 | 설명 |
|---|---|
| 선언적 (Declarative) | “원하는 상태”를 정의 → Terraform이 현재 상태와 비교 후 적용 |
| State (상태 파일) | terraform.tfstate에 현재 인프라 상태 기록 |
| Plan → Apply | 변경 사항 미리보기(plan) 후 적용(apply) |
| Provider | AWS, GCP, Azure, K8s 등 인프라 공급자 플러그인 |
| Module | 재사용 가능한 인프라 구성 단위 |
| Backend | State 파일 저장 위치 (S3, GCS, Terraform Cloud 등) |
기본 워크플로우
terraform init # 프로바이더 다운로드, 초기화
terraform plan # 변경 사항 미리보기
terraform apply # 인프라 생성/변경
terraform destroy # 인프라 삭제HCL 예제
# AWS EC2 인스턴스 생성
provider "aws" {
region = "ap-northeast-2" # 서울 리전
}
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.micro"
tags = {
Name = "web-server"
Environment = "production"
}
}
resource "aws_security_group" "web_sg" {
name = "web-sg"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
output "instance_ip" {
value = aws_instance.web.public_ip
}State 관리
Terraform의 가장 중요하면서도 까다로운 부분:
| 항목 | 설명 |
|---|---|
| Local State | 로컬 파일 (terraform.tfstate) — 개인 프로젝트용 |
| Remote Backend | S3 + DynamoDB, GCS, Terraform Cloud — 팀 협업 필수 |
| State Locking | 동시 수정 방지 (DynamoDB, Consul 등) |
| Drift Detection | terraform plan으로 코드와 실제 인프라 차이 감지 |
| Import | 기존 수동 생성 리소스를 State로 가져오기 |
주의: State 파일에는 시크릿이 포함될 수 있음 → 암호화 필수
Terraform vs OpenTofu
| 항목 | Terraform | OpenTofu |
|---|---|---|
| 라이선스 | BSL 1.1 (제한적) | MPL 2.0 (오픈소스) |
| 관리 | HashiCorp (IBM) | Linux Foundation |
| 호환 | 기준 | Terraform 1.5 호환 |
| 커뮤니티 | 기존 사용자 | 오픈소스 중시 조직 이동 중 |
장단점
장점:
- 사실상 IaC 표준 — 가장 큰 생태계
- 멀티 클라우드 지원 (3,000+ 프로바이더)
- Plan → Apply 워크플로우로 안전한 변경
- Module로 재사용 가능한 인프라 구성
- Terraform Cloud/Enterprise로 팀 협업 지원
단점:
- HCL 학습 필요 (프로그래밍 언어가 아님)
- State 파일 관리 복잡 (팀 환경에서 특히)
- BSL 라이선스 변경 논란
- 상태 드리프트 발생 가능 (수동 변경 시)