테라폼 단일 브랜치 배포 전략
1. 단일 브랜치에서 배포하는 이유
- 일관된 배포 환경: 여러 브랜치에서 배포하면 환경이 분리될 위험이 있음
- State 관리 간소화: 여러 브랜치가 각각 다른 state를 관리하면 충돌 가능성이 높아짐
- 코드 변경 추적 용이: 모든 변경 사항이 하나의 브랜치에서 관리되므로 변경 내역이 명확함
2. 여러 브랜치에서 작업할 때 생길 수 있는 문제
2.1. State 파일 충돌
여러 브랜치에서 배포를 수행하면 서로 다른 state 파일을 사용하게 될 수 있음. 이로 인해 배포 환경이 일관되지 않거나, state 충돌이 발생할 위험이 있음.
해결책:
- 원격 상태 파일(예: AWS S3 + DynamoDB)을 사용하여 충돌 방지
- 작업 시 terraform plan을 통해 예상 변경 사항을 검토
2.2. 코드 변경 내역의 모호함
여러 사람이 동시에 작업하면 코드의 출처를 구분하기 어려울 수 있음. 하지만 이상적인 코드란 누가 작성했는지 신경 쓰지 않아도 되는 코드임.
해결책:
- 코드 스타일 가이드 및 패턴을 정하고 리뷰 프로세스 적용
- Git에서 PR(풀 리퀘스트) 기반으로 코드 머지
3. Terraform 모듈 관리 Best Practices
Terraform 모듈의 가독성을 높이려면 README.md에 다음 내용을 포함하는 것이 좋음:
- 모듈 사용 방법
- 입력 변수(input variables) 설명
- 출력 값(output values) 설명
- 배포 예제 코드
README.md
# Terraform VPC Module
이 모듈은 AWS VPC를 생성하는 모듈입니다.
## 사용법
```hcl
module "vpc" {
source = "git::https://github.com/example/terraform-vpc.git"
cidr_block = "10.0.0.0/16"
environment = "staging"
}
입력 변수
변수명 | 설명 | 기본값 |
cidr_block | VPC의 CIDR 블록 | 10.0.0.0/16 |
environment | 배포 환경 | staging |
출력 값
- vpc_id: 생성된 VPC의 ID
파일 레이아웃
파일 레이아웃에 대한 규칙을 정의해야 하며, 이것은 terraform state 저장방식에도 영향을 준다.
terraform/
├── modules/
│ ├── vpc/
│ ├── ec2/
│ └── rds/
├── environments/
│ ├── staging/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ ├── outputs.tf
│ │ └── backend.tf
│ ├── production/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ ├── outputs.tf
│ │ └── backend.tf
├── backend.tf
├── providers.tf
├── versions.tf
└── README.md
### 3.3. 스테이징과 프로덕션의 격리
테라폼 state 파일은 환경별로 완전히 분리하는 것이 좋음. 이를 위해 `backend.tf`를 활용하여 환경마다 별도의 state 파일을 저장할 수 있음.
#### 예제 backend.tf (staging)
```hcl
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "staging/terraform.tfstate"
region = "us-west-2"
dynamodb_table = "terraform-lock"
}
}
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "production/terraform.tfstate"
region = "us-west-2"
dynamodb_table = "terraform-lock"
}
}
-> staging과 production 환경의 state 파일이 분리
DRY (Don't Repeat Yourself)
테라폼에서 DRY 원칙을 적용하여 보일러플레이트(반복되는 코드)를 줄일 수있다.
Terragrunt
Terraform을 효율적으로 사용할 수 있도록 도와주는 래퍼 도구이며, 코드 중복 제거와 구성 관리를 간소화하는데 사용된다.
Terragrunt를 사용하는 이유
- 환경별 코드 중복 제거: 같은 코드를 스테이징, 프로덕션 등에 반복해서 작성할 필요 없음
- 모듈 재사용성 증가: 공통 설정을 한 곳에서 정의하고, 필요한 곳에서 불러와 사용 가능
- State 관리 자동화: 환경별로 Terraform backend 설정을 자동으로 적용할 수 있음
예시 - Terraform을 사용하여 환경 구성
Terraform을 사용하는 경우, 환경별로 backend.tf를 따로 작성해야 한다.
staging/backend.tf
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "staging/terraform.tfstate"
region = "us-west-2"
dynamodb_table = "terraform-lock"
}
}
production/backend.tf
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "production/terraform.tfstate"
region = "us-west-2"
dynamodb_table = "terraform-lock"
}
}
예시 - Terragrunt 이용하여 중복 제거하기
같은 설정을 여러 곳에서 중복해서 작성할 필요 없이, 한 곳에서 관리할 수 있다.
프로젝트 구조
terraform/
├── staging/
│ ├── terragrunt.hcl
├── production/
│ ├── terragrunt.hcl
└── terragrunt.hcl # 공통 설정
terragrunt.hcl (공통 설정 파일)
- staging/terragrunt.hcl 실행 → key = "staging/terraform.tfstate"
- production/terragrunt.hcl을 실행 → key = "production/terraform.tfstate"
remote_state {
backend = "s3"
config = {
bucket = "my-terraform-state"
key = "${path_relative_to_include()}/terraform.tfstate" # 환경별 state 파일 위치
region = "us-west-2"
dynamodb_table = "terraform-lock" # state lock 위한 DynamoDB 테이블
}
}
staging/terragrunt.hcl
include {
# 부모 디렉토리에서 terragrunt.hcl을 포함
path = find_in_parent_folders()
}
production/terragrunt.hcl
include {
path = find_in_parent_folders()
}
각 환경 디렉토리에서 Terragrunt 명령어를 실행한다.
cd staging # 또는 production
terragrunt init # Terraform backend 설정 초기화
terragrunt plan # 변경 사항 미리보기
terragrunt apply # 실제 인프라 적용
Terraform vs Terragrunt
역할 | 인프라 프로비저닝 도구 | Terraform을 쉽게 사용할 수 있도록 도와주는 래퍼 |
실행 방식 | 직접 .tf 파일을 실행 | Terraform 명령어를 대신 실행 (terragrunt.hcl 사용) |
상태 관리 | 직접 S3/DynamoDB 설정 필요 | remote_state 블록으로 자동 설정 |
환경 관리 | 환경별 디렉토리 및 .tfvars 필요 | 상위 디렉토리에서 공통 설정 관리 |
코드 중복 제거 | 모듈을 사용해야 함 | include 기능으로 자동화 가능 |
'IaC' 카테고리의 다른 글
테라폼 개인 프로젝트 - Terraform workflow 구성하기 (0) | 2025.03.01 |
---|---|
테라폼 사용 권장사항 (0) | 2025.02.15 |
테라폼 스터디 9주차 - 추가 내용 (0) | 2025.02.09 |
테라폼 스터디 9주차 - 자동화된 테스트 (0) | 2025.02.09 |
테라폼 스터디 8주차 - 테라폼 코드 테스트 (0) | 2025.02.01 |