흰 스타렉스에서 내가 내리지

Terraform backend - Terraform state 를 관리 본문

DevOps

Terraform backend - Terraform state 를 관리

주씨. 2024. 9. 6. 22:22
728x90

# Terraform State

terraform apply 명령어을 실행하면, 리소스가 생성이 되고 terraform.tfstate 파일이 생성된다. 

 

tfstate 파일은 Terraform 이 인프라 리소스의 현재 상태를 추적하고 관리하는 파일이다.

Terraform 이 배포한 인프라와 관련된 정보를 저장하며, Terraform 이 해당 리소스의 변경 사항을 관리할 수 있도록 한다.

 

즉, apply 의 결과를 저장해놓은 상태라고 보면 된다. 

다만, 내가 apply 를 적용한 시점의 상태이지, 현재의 실제 인프라 상태는 아닐 수 있다. 

 

state 는 원격 저장소인 `backend` 에도 저장될 수 있다.

 


# Terraform Backend 란?

Terraform 의 state file 를 어디에 저장하고, 가져올지에 대한 설정이다. 

기본적으로는 로컬 스토리지에 저장을 하지만, 설정에 따라서 s3, consul, etcd 등 다양한 "Backend type" 을 사용할 수 있다. 

 

 

# Terraform Backend 를 사용하는 이유?

1. Locking

보통 Terraform 코드를 혼자 작성하지 않습니다. 인프라를 변경한다는 것은 굉장히 민감한 작업이 될 수 있습니다. 원격 저장소를 사용함으로써 동시에 같은 state 를 접근하는 것을 막아 의도치 않은 변경을 방지할 수 있다. 

 

2. Backup

로컬 스토리지에 저장한다는 건 유실할 수 있다는 가능성을 내포한다. 

s3 와 같은 원격저장소를 사용함으로써 state 파일의 유실을 방지한다.

 

Terraform에서 가장 보편적으로 사용하는 s3 backend 를 예제로 합니다. AWS S3는 쉽게 구축할 수 있으며 versioning 을 지원하는 안전한 저장소입니다.

 

 


# Terraform Backend 실습

보통 init 이라는 디렉터리 안에 생성한다.

 

- S3 bucket as backend 

테라폼의 상태를 저장하기 위해 S3 버킷을 생성한다. AWS S3 는 쉽게 구축할 수 있으며 versioning 을 지원하는 안전한 저장소이다.

 

- DynamoDB Table for Lock

동시에 같은 파일을 수정하지 못하도록 하기 위해 DynamoDB 에 작업에 대한 Lock 을 생성한다.

 

 

vim init.tf
provider "aws" {
  region = "ap-northeast-2" # Please use the default region ID
  # version = "~> 2.49.0" # Please choose any version or delete this line if you want the latest version
}

# S3 bucket for backend
resource "aws_s3_bucket" "tfstate" {
  bucket = "joos-be-apne2-tfstate"

  versioning {
    enabled = true # Prevent from deleting tfstate file
  }
}

# DynamoDB for terraform state lock
resource "aws_dynamodb_table" "terraform_state_lock" {
  name           = "terraform-lock"
  hash_key       = "LockID"
  billing_mode   = "PAY_PER_REQUEST"

  attribute {
    name = "LockID"
    type = "S"
  }
}

 

terraform plan
terraform apply

 

 

 

 

s3 버킷과 dynamoDB 테이블이 잘 생성되었습니다. 

 

이제 이 state 파일을 backend 로 관리해보자.

 

# 전 게시글에서 iam 관련 파일들을 생성했었다. 그 디렉토리에서
vim backend.tf
terraform {
    backend "s3" {
      bucket         = "joos-be-apne2-tfstate" # s3 bucket 이름
      key            = "terraform/iam/terraform.tfstate" # s3 내에서 저장되는 경로를 의미합니다.
      region         = "ap-northeast-2"  
      encrypt        = true
      dynamodb_table = "terraform-lock"
    }
}

 

키 경로는 실제 경로와 같으면 좋다.

 

terraform init

yes

"기존의 state 를 새로운 backend 로 copy 할거니?"

 

 

이제 s3 버킷에 tfstate 파일이 저장되어 있을 것이고, 진짜 잘 되는지 확인해보자.

 

로컬에서 tfstate 파일을 삭제한다.

rm -f terraform.tfstate terraform.tfstate.backup

로컬에서 tfstate 파일이 삭제가 되었음에도 plan 명령에 성공한다.

이제 로컬에 state 파일이 없어도, s3 버킷으로부터 tfstate 파일을 읽어오기 때문에 plan 명령에 성공한다. 

 

원격에 있는 state 파일을 불러오고 싶으면 `terraform state pull` 명령어를 사용한다.