피드로 돌아가기
컬리 기술블로그DevOps
원문 읽기
DevOps팀의 Terraform 모험
Kurly의 DevOps팀이 Terraform으로 Infrastructure as Code를 도입해 Stage/QA 환경의 반복적인 인프라 구성 작업 자동화
AI 요약
Context
서비스 증가에 따라 Stage 환경과 QA 환경이 확대되면서 반복적인 인프라 구성 작업이 급증했고, 수동 작업 중 발생하는 작은 실수들이 빈번해졌다.
Technical Solution
- Infrastructure as Code 도입: Terraform을 사용해 AWS 인프라를 코드로 선언적 관리
- 프로젝트 구조 설계: Terraform 공식 Best practices의 large 방식을 선택해 env 디렉토리(dev/qa/stg)와 modules 디렉토리(AWS 서비스별 reusable 코드)로 구분
- 상태 파일 관리: terraform.tfstate를 Infra 계정의 S3 bucket에 저장하고, AWS Console에서의 직접 수정을 차단하는 bucket policy로 접근 제어
- Module Code와 Environment Code 분리: Module Code는 AWS 공식 Provider를 참고해 Launch Template, ALB, RDS 등 서비스별 reusable 리소스로 구성하고, Environment Code에서 변수를 받아 실제 환경을 프로비저닝
- 점진적 도입 전략: Stage 및 QA 환경에 먼저 적용해 노하우를 축적한 후 운영 환경 반영 계획
- 수동 관리와 코드 관리 분리: Route53 등 특정 리소스에서 수동 수정 시 tfstate 동기화 문제("but it already exists" 에러) 발생 방지를 위해 allow_overwrite 옵션 도입 검토
Key Takeaway
Terraform 도입은 AWS 인프라에 대한 정확한 이해와 팀 전체의 학습 의지가 필수이며, 코드 기반 형상관리와 자동화된 복구로 운영 효율성을 높일 수 있지만 팀원 간 숙련도 차이와 git 익숙도 차이로 인한 추가 교육 프로세스 구축이 필요하다.
실천 포인트
여러 AWS 계정과 다양한 환경(dev/qa/stg/prod)을 관리하는 DevOps 팀에서는 Terraform의 large 방식 구조(env 디렉토리와 modules 디렉토리 분리)를 도입하면 EC2, RDS, ALB 같은 AWS 리소스를 선언적으로 관리할 수 있고, terraform.tfstate를 S3에 저장하고 bucket policy로 접근 제어하면 수동 변경으로 인한 상태 불일치를 방지할 수 있다.