가시다님이 리드하시는 Terraform 스터디에 참여하여 학습하고 있다. 이 글에서는 Google Cloud에서 Terrafom으로 Infra를 관리할 때 terraform state 파일을 저장하고 관리하는 방법에 대해 알아본다.
1. 개요
1.1 기존 상태 파일 관리의 문제점
기본적으로 Terraform은 상태를 terraform.tfstate라는 파일에 로컬로 저장한다. 이로인해 여러 사용자가 Terraform으로 Infra관리 할 때는 두가지 문제가 생긴다.
1. 여러 사용자가 로컬에 가지고 있는 상태파일(tfstate)를 어떻게 동기화할지
2. 여러 사용자가 동시에 Terraform을 Apply할 경우를 대비하기
1.2 해결방법
이러한 문제를 방지하기 위해 Cloud Storage 버킷을 사용하는 원격 backend를 구성하여 해결할 수 있다. Google Cloud의 backend를 사용하면 다음과 같이 위 문제를 해결한다.
1. 상태파일 동기화 (Cloud Storage - bucket)
이 state 파일은 기본적으로 terraform.tfstate라는 로컬 파일에 저장된다. 하지만 팀에서 여러명이 동시에 한 인프라를 관리할 때는 AWS 3S 또는 Google Cloud - Cloud storge의 Bucket에 저장하여 관리한다. 팀에서 Terraform을 사용할 때 작업이 동일한 원격 개체에 적용되도록, 모든 사람이 동일한 state로 작업하는 것이 중요하다. Remote State를 사용하여 Terraform은 상태 데이터를 원격 데이터 저장소에 기록하고 팀의 모든 구성원 간에 공유할 수 있다.
2. State locking 기능을 통해 Apply시에 Terraform Apply lock
한 사람이 Terraform으로 infra를 업데이트 할 때는 다른 인원이 상태를 변경할 수 없도록 Lock을 걸어놓을 수 있다. Google Cloud에서는 Lock 기능을 기본적으로 제공하고 있다. AWS는 기본적인 Lock을 제공하고 있지 않기 때문에 DynamoDB 를 통해 Lock을 걸 수 있다.
https://developer.hashicorp.com/terraform/language/state/remote
State: Remote Storage | Terraform | HashiCorp Developer
Terraform can store the state remotely, making it easier to version and work with in a team.
developer.hashicorp.com
2. 원격 backends 구성하기
Terraform의 백엔드는 state가 로드되는 방식 / apply와 같은 작업이 실행되는 방식을 결정한다. 기본적으로 Terraform은 일반적인 동작인 "local" backend를 사용한다.
2.1 local backend 구성해보기
손쉽게 테스트를 진행하기 위해 Cloud Shell을 이용한다.
main.tf 파일을 하나 생성하고, 아래와 같이 구성한다.
provider "google" {
project = "# 프로젝트 이름으로 대체"
region = "us-central-1"
}
resource "google_storage_bucket" "test-bucket-for-state" {
name = "# 원하는 이름으로 대체"
location = "US"
uniform_bucket_level_access = true
}
terraform {
backend "local" {
path = "terraform/state/terraform.tfstate"
}
}
위 local backend는 terraform/state 디렉토리의 terraform.tfstate 파일을 참조한다. 다른 파일 경로를 지정하려면 path를 변경하면 된다. 적용확인을 위해 이후 원격 backends로 사용할 bucket도 같이 생성한다.
Terraform은 사용하기 전에 아래 명령어로 구성된 백엔드를 초기화해준다.
terraform init
변경을 적용 해준다.
terraform apply -auto-approve
결과를 확인한다.
terraform show
콘솔에서도 생성된 버킷을 확인 할 수 있다.
2.2 Remote backend 구성해보기
다음 구성으로 로컬 백엔드를 원격으로 바꾼다.
provider "google" {
project = "# 프로젝트 이름으로 대체"
region = "us-central-1"
}
resource "google_storage_bucket" "test-bucket-for-state" {
name = "ygpark-remote-state-bucket"
location = "US"
uniform_bucket_level_access = true
}
terraform {
backend "gcs" {
bucket = "ygpark-remote-state-bucket"
prefix = "terraform/state"
}
}
나는 버킷 이름을 ygpark-remote-state-bucket로 정했다. 이 구성으로 backend를 생성하면 파일이 terraform/state/default.tfstate에 저장된다.
아래 명령어로 백엔드를 다시 초기화하여 상태를 자동으로 마이그레이션한다.
terraform init -migrate-state
state lock을 제공하는 것을 확인 할 수 있다. state를 copy할 것인지 물어보면, yes를 타이핑 해준다.
State locking은 state를 write 쓰기를 하는 모든 작업에서 자동으로 진행된다. (State locking한다는 메시지가 표시되지는 않는다.) state locking이 실패하면 Terraform이 진행되지 않는다. -lock 플래그를 사용하여 상태 잠금을 비활성화할 수 있지만 권장되지는 않는다.
버킷 안에 생성된 State 파일을 확인 할 수 있다.
3. 마치며
Google Cloud의 Backend는 lock기능을 기본으로 제공하기 때문에 AWS에서보다 훨씬 편리하게 backend를 구성할 수 있다. 이번에도 좋은기회로 Terrafom을 학습하면서 AWS 기본기능들도 같이 학습을 하고있는데, 이후에는 현업에도 적용할 수 있도록 GCP에도 적용해보고 싶다!
'스터디 > Terraform' 카테고리의 다른 글
[Terraform] 컨테이너 이미지로 Cloud Run 백엔드와 HTTP(s) LB 구성하기 (2) | 2022.12.12 |
---|