본문 바로가기
IT & Tech 정보

🧱 Terraform 기반 DB 마이그레이션 + GitOps 통합 구조: RDS/Cloud SQL/PlanetScale까지 자동화하는 법

by 지식과 지혜의 나무 2025. 5. 29.
반응형



🌍 배경

현대 DevOps 환경에서 “코드로 모든 것을 정의한다”는 Infrastructure as Code(IaC)는 더 이상 선택이 아닌 필수입니다.
하지만 DB 마이그레이션은 여전히 수동, 혹은 애플리케이션과 느슨하게 연결되어 있는 경우가 많습니다.

실리콘밸리의 상위 SRE/DevOps 팀들은 Terraform으로 DB 인프라를 정의하고, 동시에 GitOps 기반으로 DB 마이그레이션을 통합하여 완전 자동화된 구조를 구성하고 있습니다.



🎯 목표
• Terraform으로 DB 인프라 생성 및 관리 (RDS, Cloud SQL, PlanetScale 등)
• GitHub Actions + ArgoCD 기반 마이그레이션 연동
• DB 버전 관리, 보안, 마이그레이션 승인까지 Git으로 추적
• 머지 시점에만 마이그레이션 실행되며 자동 롤백 가능



⚙️ 전체 구성 아키텍처

GitHub
├── infra/terraform → DB 생성
├── app/migrations → SQL or Prisma/Flyway 등
└── .github/workflows/ → DB 상태 확인 및 마이그레이션 트리거

CI/CD
├── Terraform apply (dev/stage/prod)
└── Migration apply (ArgoCD or custom K8s job)

ArgoCD
└── Preview 환경 + 마이그레이션 동기화




📁 디렉토리 구조

repo-root/
  ├── infra/
  │   └── terraform/
  │       ├── rds.tf
  │       ├── variables.tf
  │       └── outputs.tf
  ├── migrations/
  │   └── 20240529_initial_schema/
  └── .github/
      └── workflows/
          ├── terraform-apply.yml
          └── db-migrate.yml




🧪 예시: Terraform으로 RDS 생성

resource "aws_db_instance" "app_db" {
  identifier        = "app-db-${var.env}"
  allocated_storage = 20
  engine            = "postgres"
  instance_class    = "db.t3.micro"
  username          = "admin"
  password          = var.db_password
  skip_final_snapshot = true
}




🔧 GitHub Actions – Terraform Apply + Migration

name: Infra + DB Migration

on:
  push:
    branches: [main]

jobs:
  apply-infra:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v2

      - name: Terraform Apply
        run: |
          terraform init
          terraform apply -auto-approve

  migrate:
    needs: apply-infra
    runs-on: ubuntu-latest
    steps:
      - name: Run migration
        run: |
          psql ${{ secrets.DB_URI }} < migrations/20240529_initial_schema/schema.sql




🔁 실패 대응 전략
• PR 시점마다 dry-run + 스냅샷 기반 롤백
• terraform destroy에 의존하지 않고 DB snapshot → 재적용
• 마이그레이션 실패 시 Slack으로 알림 후 자동 revert PR 생성



🔐 보안 및 운영 팁

항목 팁
DB 비밀번호 secrets.GITHUB_TOKEN, Vault, AWS Secrets Manager로 관리
Migration 승인 CODEOWNERS로 승인 체계 필수화
Terraform Lock terraform state는 S3 + DynamoDB Lock으로 충돌 방지
커스텀 모듈화 환경별 (dev/stage/prod) DB 인프라 재사용을 위해 모듈화




📈 기대 효과

요소 효과
신뢰성 배포와 동시에 정확한 DB 스키마 적용 보장
가시성 모든 DB 변경 내역 Git commit으로 추적 가능
속도 신규 DB 생성 후 자동 마이그레이션까지 풀자동화
보안 DB 접근 최소화, Git 기반 인증 절차 완비




🧩 결론

이 전략은 Terraform을 단순한 VM·LB 생성 도구로 쓰는 것이 아니라, DB 환경까지 완전 통합하는 고급 GitOps 운영 전략입니다.

특히:
• 환경별 DB 자동 구성
• PR 기반 마이그레이션 자동 적용
• 장애 시점 스냅샷 기반 복원
이러한 모든 흐름이 하나의 CI/CD 파이프라인에서 자연스럽게 흘러갑니다.


반응형