인프라를 수동으로 관리하면 재현 불가능, 문서화 누락, 환경 차이 문제가 생깁니다. Terraform으로 인프라를 코드로 선언하면 Git으로 버전 관리하고, 동일한 환경을 반복 생성할 수 있습니다.
Terraform 입문 — 인프라를 코드로 관리하기
Infrastructure as Code의 대표 도구 Terraform 시작 가이드. HCL 문법, Provider 설정, State 관리, Module 구성과 AWS·GCP 인프라 프로비저닝 실전 예시를 포함한다.
한 줄 요약: Terraform은 AWS, GCP, Azure 등 클라우드 인프라를 코드(.tf 파일)로 정의하고, terraform apply 한 명령으로 프로비저닝하는 IaC(Infrastructure as Code) 도구다.
수동으로 AWS 콘솔에서 서버를 만드는 대신, 코드로 인프라를 관리하면 재현 가능성, 버전 관리, 코드 리뷰가 가능해진다. 이 가이드는 Terraform의 핵심 개념과 실전 워크플로우를 정리한다.
IaC가 필요한 이유


Terraform의 워크플로우는 Write → Plan → Apply의 3단계다. .tf 파일에 원하는 인프라 상태를 선언하고, terraform plan으로 변경 사항을 미리 확인한 뒤, terraform apply로 실제 적용한다. 핵심은 '선언적'이라는 것 — 어떻게 만들지가 아니라 무엇을 원하는지를 정의한다.
AWS EC2 인스턴스 생성 예시# main.tf provider "aws" { region = "ap-northeast-2" # 서울 } resource "aws_instance" "app" { ami = "ami-0c9c942bd7bf113a2" instance_type = "t3.micro" tags = { Name = "my-app-server" } } resource "aws_security_group" "app_sg" { ingress { from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } }
State 파일은 Terraform이 현재 인프라 상태를 추적하는 JSON 파일이다. 로컬에 저장하면 팀 협업이 불가능하므로, S3 + DynamoDB 또는 Terraform Cloud를 사용해 원격 state를 관리한다. State 파일에는 비밀 정보(DB 비밀번호 등)가 포함될 수 있으므로 암호화 저장이 필수다.
기본 개념
- Provider: AWS, GCP 등 클라우드 제공자
- Resource: 생성할 인프라 (EC2, S3 등)
- State: 현재 인프라 상태 추적
- Plan/Apply: 변경사항 미리보기 후 적용

모듈화와 환경 분리
모듈로 반복되는 인프라 패턴을 재사용한다. VPC, ECS 클러스터, RDS 인스턴스 등을 모듈로 만들어 dev/staging/prod 환경에서 변수만 바꿔 사용한다. Workspaces 또는 디렉토리 분리로 환경을 관리한다.
terraform destroy는 모든 리소스를 삭제한다. 프로덕션 환경에서는 절대 실행하지 말 것. prevent_destroy = true lifecycle 설정으로 중요 리소스의 실수 삭제를 방지하라.Terraform 대안
Pulumi: TypeScript/Python/Go 등 범용 언어로 인프라를 정의한다. 프로그래밍 언어의 조건문, 루프, 함수를 그대로 사용할 수 있어 Terraform의 HCL보다 표현력이 높다. AWS CDK: AWS 전용이지만 TypeScript로 CloudFormation을 생성한다. OpenTofu: Terraform의 오픈소스 포크로, HashiCorp의 라이선스 변경(BSL) 이후 대안으로 떠올랐다. Terraform과 거의 호환되며 Linux Foundation이 관리한다.