✏️ Terraform State 의 원리와 목적을 이해한다!
지금까지 테라폼을 사용하여 클라우드 상의 리소스를 코드로 생성해보았다. 이와 같이 리소스를 생성하는 경우 생성/업데이트/삭제 되는 리소스들에 대한 모니터링 및 현행화가 필요할 것이다.
// 예시 일부 발췌
{
"version": 4,
"terraform_version": "1.5.6",
"serial": 1,
"lineage": "unique-id-for-this-state",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "google_compute_network",
"name": "custom_vpc",
"provider": "provider[\"registry.terraform.io/hashicorp/google\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"id": "projects/your-gcp-project-id/global/networks/custom-vpc",
"name": "custom-vpc",
Terraform State 은 현재 클라우드 상에 올라와 있는 인프라 설정값들의 메타 데이터를 저장하고 있는 저장소이다. terraform.tfstate 에 테라폼으로 생성한 모든 리소스의 메타 데이터가 저장되어있다.Terraform State 값을 원격 저장소에 저장하여 사용할 것을 권장한다. resource block 을 사용하게 된다. 이 resource block 이 해당 리소스의 고유값으로 동작하여 terraform state 파일에서 해당 리소스의 키 역할을 하게 된다. terraform state 파일에 해당 리소스의 메타 데이터가 저장된다. terraform plan 과 같은 커맨드를 실행하면, 테라폼은 terraform state 파일을 참고하여 해당 리소스가 이미 있음을 인지하고 업데이트 또는 삭제 시 발생할 결과값을 프롬포트에 출력한다.terraform apply 를 통해 실제 리소스에 설정값이 변경되고 나면 테라폼은 리소스의 업데이트된 메타 데이터를 terraform state 파일에 저장한다.terraform state 파일 저장하기사실 terraform state 파일을 원격 저장소가 아닌 로컬에 저장해도 문제가 되지는 않는다. 그렇다면 이 파일을 왜 원격 저장소에 저장해야할까? 🤔
개발자 A 와 내가 동시에 테라폼 코드를 작성한다고 가정하자. 우리는 각각의 컴퓨터에서 테라폼 코드를 작성하고 terraform apply 커맨드를 통해 설정값을 적용하였다. 그러나 예상하지 못한 결과값이 나왔다. 왜 그럴까?
정답은 가장 최신 버전의 terraform state 을 가져와 작업하지 않았기 때문이다. 내가 컴퓨터에서 개발을 진행하고 있는 사이 다른 개발자 A가 테라폼 코드를 작성하여 적용시킬 경우 클라우드 상에 리소스 현황은 변경된다. 이때 개발자 A가 가진 파일은 가장 최신 파일이 되겠지만 내 컴퓨터에 저장된 파일은 이전 버전의 terraform state 파일이 된다.
이 경우 테라폼이 현재 클라우드 상에 올라온 리소스의 설정값이 아닌 이전 버전의 설정값에 내 테라폼 코드를 적용시키므로 원치 않는 결과가 유발 될 수 있다. 따라서 terraform state 파일을 원격 저장소에 저장해 모두가 공유하고 terraform plan 또는 terraform apply 커맨드 실행 전 해당 파일을 다운로드 하여 현행화하는 작업이 필요하다.
로컬 저장소
1. state 파일에 업데이트가 일어나는 경우 팀원들이 일일히 해당 파일을 다운로드 해야한다.
2. 두 명의 팀원이 동시에 terraform apply 를 실행하는 경우 오류가 발생하거나 state 파일에 오염이 발생한다.
3. state 파일에 권한 설정을 할 수 없으므로 모든 팀원이 해당 파일에 저장된 모든 민감한 정보를 열람 할 수 있다.
👉 이러한 한계점을 원격 저장소 가 해결한다.
원격 저장소
1. 테라폼 내에 remote backend 를 설정하면 테라폼이 terraform plan, terraform apply 를 실행 할 때마다 자동으로 원격 저장소에서 최신 파일을 다운로드하고 업로드 한다.
2. Cloud Storage Bucket 의 경우 파일 잠금 기능을 제공하므로 여러 사람이 동시에 terraform apply 를 실행해도 해당 파일에 대한 오염이 발생하지 않는다.
3. Cloud Storage Bucket 의 경우 IAM 기능과 암호화 기능을 제공하므로 민감한 정보가 있는 경우 해당 파일의 접근을 조정 할 수 있다.
원격 저장소 (예: 버킷) 생성하기
원격 저장소를 backend 로 설정하기
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = ">= 5.0.0"
}
}
backend "gcs" {
bucket = "my_bucket"
prefix = "terraform/state"
}
}
terraform init 실행하기terraform.tfstate 로컬 파일이 있음을 감지하고 해당 파일을 버킷에 복사함.코드를 .git 에서 관리하는 경우 state 파일이 git 저장소에 중복 저장되지 않도록 .gitignore 파일 사용하기
state 파일에 민감한 정보 저장하지 않기
state 파일 암호화 하기
state 파일 수동으로 수정하지 않기