클라우드

Terraform tfstate 상태 파일 관리

CleanCoder 2024. 3. 20. 20:40

 

Terraform의 tfstate 파일은 Terraform이 관리하는 인프라의 현재 상태를 기록하는 핵심 파일이다. 이 파일은 인프라가 Terraform 구성과 어떻게 일치하는지, 어떤 리소스가 실제 클라우드 환경에 존재하는지 파악하는 데 필수적이다. 하지만 팀이나 프로젝트 규모가 커질수록 이 상태 파일을 안전하게 관리하고, 여러 사람이 동시에 사용하는 복잡성을 해결해야 하는 상황이 발생한다.

 

Terraform 기본 명령어 (주로 사용하는 3가지)

init 명령어

Terraform 프로젝트를 시작할 때 가장 먼저 init 명령어를 실행한다. 이 명령어는 Terraform 초기화 과정을 담당하며, 다음과 같은 작업을 수행한다:

  • 필요한 Terraform 프로바이더들을 다운로드한다.
  • 백엔드 구성을 설정한다. 예를 들어, Terraform 상태 파일을 어디에 저장할지 결정한다.
  • Terraform 모듈을 초기화한다.

init 명령어는 프로젝트 디렉토리 내에 .terraform 폴더를 생성하여, 여기에 필요한 모든 설정과 파일을 저장한다.

plan 명령어

코드 변경 후 실제 인프라에 적용하기 전에, plan 명령어로 변경 사항을 미리 확인한다. plan 명령어는 다음을 수행한다:

  • 현재 코드와 실제 인프라 상태를 비교한다.
  • 변경 사항을 보여준다. 이를 통해 어떤 리소스가 생성, 변경, 삭제될지 사전에 확인할 수 있다.
  • 변경 사항을 실행하기 전에 검토할 수 있는 계획을 제시한다.

plan 명령어는 실제 변경을 적용하지 않고, 변경될 내용만 보여준다는 점에서 중요하다.

apply 명령어

plan 명령어로 변경 사항을 확인한 후, apply 명령어로 이 변경 사항을 실제 인프라에 적용한다. apply 명령어는 다음을 수행한다:

  • plan에서 제시된 변경 사항을 인프라에 적용한다.
  • 새로운 리소스를 생성하거나, 기존 리소스를 업데이트하거나, 불필요한 리소스를 삭제한다.
  • 변경 후의 인프라 상태를 Terraform 상태 파일에 업데이트한다.

apply 명령어는 코드의 변경사항을 실제 환경에 적용하기 때문에, 실행 전에 변경사항을 충분히 검토하는 것이 중요하다.

 

 

중앙 집중식 상태 관리

Terraform 프로젝트를 여러 사람이 함께 작업한다면, 중앙에서 상태 파일을 관리하는 것이 좋다. 이 방법은 모든 팀원이 동일한 인프라 상태에 기반하여 작업할 수 있도록 해준다. 가장 일반적인 방법은 Amazon S3와 같은 객체 스토리지 서비스를 사용해 상태 파일을 저장하는 것이다.

S3와 DynamoDB를 활용한 상태 파일 관리

Amazon S3를 사용하면 Terraform 상태 파일을 중앙에 저장하고, 버전 관리 및 암호화를 통해 보안을 강화할 수 있다. 또한, Amazon DynamoDB를 사용해 상태 파일에 대한 락(lock)을 설정하면, 동시에 여러 사람이 상태 파일을 변경하는 것을 방지할 수 있다. 이는 Terraform 작업의 안정성을 보장하며, 충돌을 방지한다.

Terraform 백엔드 구성 예시

terraform {
  backend "s3" {
    bucket         = "내-terraform-state-버킷"
    key            = "path/to/my/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "내-terraform-lock-테이블"
    encrypt        = true
  }
}

 

 

 

 

이외에도 Altantis가 있다.

Atlantis는 Terraform 코드의 협업과 자동화를 향상시키기 위한 오픈소스 도구로, GitHub, GitLab, Bitbucket과 같은 버전 관리 시스템에서 작업하는 팀에 유용하다. Atlantis를 사용하면, 팀원들이 Pull Request(PR)를 통해 Terraform 코드의 변경을 제안할 때 자동으로 Terraform plan과 apply를 실행하고, 그 결과를 PR에 코멘트로 남길 수 있다. 이로써 실제 인프라에 변경을 적용하기 전에 코드 리뷰와 검

증 과정을 자동화하여 보다 안전하게 인프라를 관리할 수 있다.

 

https://blog.amis.com/infrastructure-as-code-day-2-collaboration-242bd82a102c
https://www.env0.com/blog/atlantis-terraform-guide

 

Atlantis 사용 시 고려 사항

  1. Pull Request 기반의 Workflow: Atlantis는 PR을 중심으로 작동한다. PR이 생성되면, Atlantis는 자동으로 Terraform plan을 실행하고 결과를 코멘트로 남긴다. PR이 승인되고 병합 준비가 되면, apply 명령을 PR에 코멘트로 남겨 실제 변경사항을 적용할 수 있다.
  2. 안전한 Apply 실행: Atlantis는 PR에 대한 리뷰와 승인 과정을 거쳐야만 apply를 실행할 수 있도록 함으로써, 실수로 인한 잠재적인 인프라 변경 사고를 방지한다.
  3. atlantis.yml 구성: Atlantis는 atlantis.yml 파일을 통해 프로젝트별 Terraform 실행 설정을 제공한다. 이 파일에서는 작업 디렉토리, 워크플로우, 사용자 정의 명령 등을 설정할 수 있다.

 

webhook을 atlantis서버에 적용해주어야 한다.

bitbucket webhook

 

Terraform 폴더 구조 예시

https://medium.com/@nanditasahu031/atlantis-with-terraform-gcp-dfe1ec317c5b

 

Atlantis 예시 구성

atlantis.yml 설정 예시:

 

version: 3
projects:
- name: my-terraform-project
  dir: test
  workspace: workspace
  autoplan:
    when_modified: ["*.tf", "*.tfvars"]
    enabled: true
  apply_requirements: [approved]

이 예시에서는 terraform 디렉토리 내의 Terraform 프로젝트를 위한 설정을 정의하고 있다. .tf 또는 .tfvars 파일이 변경될 경우 자동으로 plan을 실행한다. apply는 PR이 승인되어야만 실행될 수 있다.

 

Atlantis 정리

  • Github PR 생성 시 변경된 파일 기준으로 자동으로 plan 결과를 comment 로 등록
  • Github PR comment 에 명령어를 직접 입력해서 plan 과 apply 를 실행
  • apply 후 자동 merge + branch 삭제 지원
  • apply 필수체크 설정 가능 (approved, mergeable)
  • terraform workspace 지원, autoplan 을 사용하려면 project 설정이 필요함

https://www.runatlantis.io/docs/

https://medium.com/@nanditasahu031/atlantis-with-terraform-gcp-dfe1ec317c5b

 

Infracost 정리

  • GitHub PR이 생성될 때 Terraform Plan 결과를 기반으로 인프라 비용을 추정해 코멘트로 등록한다.
  • Atlantis와의 통합이 가능하다.

https://www.infracost.io/docs/