본문 바로가기

IaC

테라폼 스터디 - 10주차

테라폼 단일 브랜치 배포 전략

 

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 기능으로 자동화 가능