# Terraform 초보자를 위한 베스트 프랙티스와 기본 Cheat Sheet — 인프라 자동화를 쉽게 시작하는 방법

---

# # 서론: “왜 Terraform을 배워야 할까?”

클라우드 환경이 복잡해짐에 따라 **인프라 자동화**가 선택이 아닌 필수가 되었습니다. 서버를 직접 손으로 만들고 설정하는 방식은 실수 위험이 크고, 팀원 간 일관성을 유지하기 어렵습니다. 여기서 등장하는 것이 바로 **Terraform**입니다. 선언형 코드로 인프라를 정의하고, 버전 관리와 재현성을 확보해 줍니다.

하지만 막상 Terraform을 처음 접하면 명령어, 파일 구조, 모듈 활용 등 배워야 할 것이 많아 “어디서부터 시작해야 할까?” 하는 고민이 생깁니다. 이 글에서는 초보자도 바로 적용할 수 있는 **Terraform 베스트 프랙티스**와 **Cheat Sheet**를 정리해, 복잡한 인프라를 손쉽게 코드로 관리하는 길을 열어드립니다.

---

# # 본론

## # 1️⃣ 프로젝트 구조를 명확히 잡아라

```
text

├── environments/

│   ├── dev/

│   │   └── main.tf

│   └── prod/

│       └── main.tf

├── modules/

│   ├── vpc/

│   │   └── main.tf

│   └── ec2/

│       └── main.tf

└── terraform.tfvars

```

- **환경별 디렉터리**(`dev`, `prod`)를 두어 서로 다른 설정을 격리합니다.

- **재사용 가능한 모듈**은 `modules/`에 보관해, VPC, EC2 등 공통 리소스를 한 번만 정의하고 여러 환경에서 호출합니다.

- `terraform.tfvars` 파일에 변수값을 넣어 코드와 설정을 분리하면, 비밀번호 같은 민감 정보는 `.gitignore`에 추가해 보안을 강화할 수 있습니다.

> **팁**: `backend` 설정을 이용해 상태 파일을 원격 S3 혹은 Terraform Cloud에 저장하면 팀 전체가 동일한 상태를 공유할 수 있어 충돌을 방지합니다.

---

## # 2️⃣ 변수와 출력값을 적극 활용하기

```
hcl

variable 'instance_type' {

  description = 'EC2 인스턴스 종류'

  type        = string

  default     = 't3.micro'

}

output 'instance_id' {

  value = aws_instance.web.id

}

```

- **변수**는 하드코딩을 피하고, 환경에 맞게 값만 바꾸면 되도록 해 줍니다.

- **출력값**(`output`)은 다른 모듈이나 CI/CD 파이프라인에서 활용할 수 있는 중요한 정보를 제공합니다. 예를 들어, 배포 후 생성된 EC2 인스턴스 ID를 자동으로 알림 시스템에 전달할 수 있습니다.

---

## # 3️⃣ `terraform fmt`와 `terraform validate`로 코드 품질 관리

- **`terraform fmt`**: HCL(HashiCorp Configuration Language) 코드를 자동으로 정렬해 가독성을 높입니다.

- **`terraform validate`**: 현재 디렉터리의 구문과 논리 오류를 사전에 검사해, `plan` 단계에서 발생할 수 있는 문제를 미리 차단합니다.

CI 파이프라인에 이 두 명령어를 포함시키면, PR 단계에서 코드 스타일과 오류를 자동으로 검증해 팀 전체의 코드 품질을 유지할 수 있습니다.

---

## # 4️⃣ 상태 파일 관리와 백업 전략

Terraform은 **상태 파일(state file)**에 현재 인프라 상태를 저장합니다.

- **원격 백엔드**(예: AWS S3 + DynamoDB 잠금) 사용을 권장합니다.

- **버전 관리**: 상태 파일이 손상되면 복구가 어려우니, 정기적인 스냅샷을 자동으로 생성하도록 설정합니다.

- **잠금(Locking)**: 동시에 여러 사용자가 `apply`를 실행하면 충돌이 발생할 수 있습니다. DynamoDB를 이용한 잠금 메커니즘으로 이를 방지합니다.

---

## # 5️⃣ 모듈 버전 관리와 레지스트리 활용

- **공식 Terraform Registry**(registry.terraform.io)에서 검증된 모듈을 사용하면 보안과 안정성을 확보할 수 있습니다.

- 자체 모듈은 **Git 태그**와 **버전 번호**(예: `v1.2.0`)를 명시해, `source = 'git::https://github.com/your-org/terraform-aws-vpc.git?ref=v1.2.0'`와 같이 버전을 고정합니다.

- 버전 고정을 통해, 모듈 업데이트 시 의도치 않은 변경이 적용되는 것을 방지하고, `plan` 단계에서 차이를 명확히 확인할 수 있습니다.

---

# # 결론: 지금 바로 Terraform 베스트 프랙티스를 적용해 보세요

Terraform은 복잡한 클라우드 인프라를 코드 하나로 관리할 수 있는 강력한 도구입니다. 이번 글에서 소개한 **프로젝트 구조 설계, 변수·출력 활용, 코드 포맷·검증, 상태 파일 관리, 모듈 버전 관리** 다섯 가지 핵심 베스트 프랙티스를 그대로 따라 하면, 초보자도 안정적인 인프라 자동화를 시작할 수 있습니다.

> **행동 유도**

> 1. 오늘 소개한 폴더 구조를 로컬에 바로 만들어 보세요.

> 2. 간단한 `variables.tf`와 `outputs.tf`를 추가해 변수를 실험해 보세요.

> 3. `terraform fmt && terraform validate`를 실행해 코드 품질을 점검하고, GitHub Actions에 자동화 워크플로를 연결해 보세요.

작은 성공이 쌓이면, 점점 더 큰 규모의 인프라도 자신 있게 관리할 수 있습니다. 지금 바로 Terraform을 설치하고, **인프라 자동화**의 첫 발을 내딛어 보세요! 🚀
