/인프라/Terraform으로 인프라 코드화(IaC) 실전: 모듈 설계부터 상태 관리까지
InfrastructureTerraformIaC

Terraform으로 인프라 코드화(IaC) 실전: 모듈 설계부터 상태 관리까지

This article is not yet available in English. Showing the original Korean version.

IaC가 필요한 이유 클릭으로 만든 인프라는 재현이 불가능합니다. Terraform으로 인프라를 코드로 정의하면 버전 관리, 코드 리뷰, 자동화가 가능해집니다. 프로젝트 디렉터리 구조 terraform/ ├── environments/ │ ├── prod/ │ │ …

Terraform으로 인프라 코드화(IaC) 실전: 모듈 설계부터 상태 관리까지

IaC가 필요한 이유

클릭으로 만든 인프라는 재현이 불가능합니다. Terraform으로 인프라를 코드로 정의하면 버전 관리, 코드 리뷰, 자동화가 가능해집니다.

프로젝트 디렉터리 구조

CODE
terraform/
├── environments/
│   ├── prod/
│   │   ├── main.tf
│   │   └── terraform.tfvars
│   └── staging/
└── modules/
    ├── vpc/
    ├── eks/
    └── rds/

모듈 설계

HCL
# modules/vpc/main.tf
resource "aws_vpc" "main" {
  cidr_block           = var.cidr_block
  enable_dns_hostnames = true

  tags = merge(var.common_tags, {
    Name = "${var.project}-${var.environment}-vpc"
  })
}

variable "cidr_block" {
  type    = string
  default = "10.0.0.0/16"

  validation {
    condition     = can(cidrhost(var.cidr_block, 0))
    error_message = "유효한 CIDR 형식이어야 합니다."
  }
}

상태(State) 원격 관리

HCL
terraform {
  backend "s3" {
    bucket         = "my-company-terraform-state"
    key            = "prod/terraform.tfstate"
    region         = "ap-northeast-2"
    encrypt        = true
    dynamodb_table = "terraform-state-lock"
  }
}
Bash
# State 잠금 테이블 생성
aws dynamodb create-table \
  --table-name terraform-state-lock \
  --attribute-definitions AttributeName=LockID,AttributeType=S \
  --key-schema AttributeName=LockID,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST

CI/CD 통합

YAML
name: Terraform
on:
  pull_request:
    paths: ['terraform/**']

jobs:
  plan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: hashicorp/setup-terraform@v3
      - run: terraform init
      - run: terraform fmt -check -recursive
      - run: terraform validate
      - run: terraform plan -out=tfplan

실전 팁

tfstate 파일 절대 git에 커밋 금지 (.gitignore)

CODE
*.tfstate
*.tfstate.backup
.terraform/

sensitive 변수 마스킹

HCL
variable "db_password" {
  type      = string
  sensitive = true
}

Terraform은 단순한 도구가 아닙니다. 팀의 인프라 운영 방식 자체를 바꾸는 문화적 전환입니다.

참고: 공식 문서

이 글에서 다루는 동작·설정·에러의 1차 출처는 다음 공식 문서입니다. 버전별 옵션과 정확한 동작은 여기서 확인하세요.

✦ ✦ ✦
편집 검토 · Editorial Review

Nodelog는 모든 콘텐츠의 내용과 출처를 공개 전에 검토합니다. 환경(OS·버전)에 따라 결과가 달라질 수 있는 기술 정보는 공식 문서와 함께 확인하며, 검토 기준과 정정 원칙은 편집 정책에서 안내합니다. 오류를 발견하시면 이메일로 제보해 주세요 — 확인 후 신속히 정정합니다.

편집 책임 · Nodelog 기술 편집팀·발행 ·
관련 공식 문서Terraform 공식 문서

Comments

Be the first to comment.