Terraform은 인프라를 코드로 관리하는 IaC(Infrastructure as Code) 도구입니다. 이는 선언적 관리로 안정적이고 일관된 인프라 프로비저닝을 지원하죠. 그러나 팀이 커지고 환경이 다양해지면, Terraform을 사용할 때 코드 중복과 관리 복잡도 문제가 생깁니다. 이 글에서는 모듈화, 워크스페이스와 변수 파일(.tfvars) 관리, Terragrunt*로 Terraform의 이러한 문제를 해결하는 방법을 알아보겠습니다.
(이 글은 Terraform의 주요 개념(예: Backend)을 이해하는 독자를 대상으로 작성했습니다)
*Terragrunt: Terraform으로 작성한 IaC를 확장하는 오케스트레이션 도구
Terraform 기본 이해
먼저 Terraform 워크플로와 기본 파일을 짚고 가겠습니다.
워크플로
Terraform의 워크플로는 Write(Define & Initialize), Plan, Apply 이렇게 세 단계로 구성됩니다. 각 단계에서 수행하는 활동은 다음과 같습니다.
- Write 단계: 여러 클라우드 제공업체와 서비스에 리소스를 정의하고 버전을 관리합니다.
- Plan 단계: 기존 인프라와 구성을 기반으로 실행 계획을 생성합니다. 이 단계에서는 변경 사항을 미리 확인할 수 있습니다.
- Apply 단계: 승인 후 리소스 의존성을 고려해 제안된 작업을 올바른 순서로 수행합니다. 이 단계에서 실제 인프라가 변경됩니다.
Terraform 워크플로. 출처=https://developer.hashicorp.com/terraform/intro
 | 인포그랩 GitLab](https://cdn.infograb.io/insight_prod/image/blog/2024-11/2024-11-13-terragrunt-0.png)
기본 파일
다음은 기존에 Terraform을 사용한 폴더 구조 예시입니다. 보통 한 폴더 안에 아래와 같은 파일 묶음이 있습니다.
├── .terraform.lock.hcl
├── main.tf
├── terraform.tfstate
├── terraform.tfvars
├── user_data.sh
├── variables.tf
└── version.tf
Terraform의 워크플로 단계별로 각 파일은 다음 역할을 합니다.
-
Write 단계
main.tf: 인프라 리소스를 정의하는 메인 구성 파일입니다. 이 파일에서 실제로 생성할 인프라를 선언합니다.variables.tf: Terraform에서 사용할 변수를 선언합니다. 이로써 다양한 환경에서 설정값을 쉽게 변경할 수 있습니다.version.tf: Terraform과 필요한 Provider의 버전을 지정해 버전 호환성 문제를 방지합니다.user_data.sh: EC2 인스턴스를 시작할 때 실행될 스크립트를 포함합니다. 인스턴스를 초기화할 때 필요한 설정이나 소프트웨어 설치를 자동화할 수 있습니다.
-
Plan 단계
terraform.tfvars: 변숫값을 지정해 다른 환경에서도 재사용할 수 있는 설정을 정의합니다. 이는variables.tf와 함께terraform plan명령에 사용돼 인프라 변경 사항을 예측하는 데 쓰입니다..terraform.lock.hcl: Provider와 모듈 버전을 잠가 Terraform을 실행할 때, 동일한 버전이 사용되도록 고정합니다. 이 파일은terraform init명령을 실행할 때 생성되지만, 계획 단계에서 일관된 버전을 사용해 예측 가능한 계획을 수립하는 데 중요한 역할을 합니다.
-
Apply 단계
terraform.tfstate: 현재 인프라 상태를 저장해 변경 사항을 관리하는 핵 심 파일입니다.terraform apply명령을 실행할 때, 이 파일이 업데이트돼 실제 인프라 상태를 반영합니다.
코드 중복, 관리 복잡도 해결 방법
DevOps에서 다양한 환경을 다룰 때 생산성을 향상하려면, PoC(Proof of Concept) 환경을 신속하게 구축해야 하죠. 그러나 단순히 인프라만 자동화한다고 생산성이 높아지지는 않습니다. 각 환경에 맞춘 개별 코드 작성에 따른 코드 중복 문제와 유지 관리 문제부터 해결해야 하죠.
Terraform을 사용할 때도 마찬가지입니다. 앞서 언급했듯 팀이 커지고 환경이 다양해지면, Terraform을 사용할 때 코드 중복과 관리 복잡도 문제가 발생하는데요. 이 문제는 다음 방법으로 해결할 수 있습니다.
- 모듈화: 반복적인 인프라 구성을 모듈로 만들고 여러 환경에서 재사용해 코드 중복을 줄입니다.
- 워크스페이스와 변수 파일(
.tfvars) 관리: 각 환경에 별도의 워크스페이스를 사용해 서로 독립적으로 인프라를 관리합니다. 또 환경별 변숫값을 지정해 다양한 환경에서 코드 유연성을 높입니다.
코드 재사용성을 높이려면 위 방법은 둘 다 사용하는 게 좋습니다. 각 방법을 자세히 살펴보겠습니다.