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
기본 파일
다음은 기존에 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
명령을 실행할 때, 이 파일이 업데이트돼 실제 인프라 상태를 반영합니다.