[기본 구성 요소] state 파일

2024. 11. 26. 14:05Terraform/[인프런] 아키텍처와 함께하는 Terraform

1. state 파일

- Terraform이 관리하는 인프라의 현재 상태를 저장하는 파일이다.
- Terraform이 리소스를 추적하고 변경 사항을 계산하며 기존 리소스와의 동기화를 유지하는데 핵심적인 역할을 한다.
- 기본적으로 terraform.tfstate라는 이름으로 로컬에 저장된다.
- 원격 저장소(ex. S3, Azure Blob 등)에서도 관리할 수 있다.

 

 

2. state 파일 주요 특징

- 현재 상태 저장 : Terraform이 관리하는 모든 리소스 구성을 저장하여 실제 상태와 동기화한다.
- 변경 사항 추적 : terraform planterraform apply를 실행할 때, state 파일을 기준으로 변경 사항 계산한다.
- 리소스 간 의존성 관리 : 의존성 추적하여 Terraform이 올바른 순서로 리소스를 생성, 수정, 삭제하도록 한다.
- 로컬 및 원격 관리 : 기본적으로 로컬에 저장되지만 협업 시 원격 저장소를 구성해 여러 사용자가 공유할 수 있다.
- 민감한 데이터 포함 가능 : 비밀번호나 키와 같은 민감한 데이터도 포함된다.
- 자동 생성 및 관리 : Terraform 실행 시 자동으로 생성되고, 필요할 때 업데이트 된다.

 

 

3. state 파일 구조

- JSON 형식으로 저장된다.
- Version : Terraform state 파일의 버전 정보
- Resources : Terraform이 관리하는 모든 리소스 정보
- Dependencies : 리소스 간의 의존성 정보
* 예시
{
  "version": 4,
  "resources": [
    {
      "type": "aws_instance",
      "name": "example",
      "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
      "instances": [
        {
          "attributes": {
            "id": "i-0abc123456def7890",
            "ami": "ami-0c1a7f89451184c8b",
            "instance_type": "t2.micro",
            "tags": {
              "Name": "ExampleInstance"
            }
          }
        }
      ]
    }
  ]
}

 

 

4. state 파일 예제

- Terraform 구성 파일 예제
* 예제
provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_instance" "example" {
  ami           = "ami-0c1a7f89451184c8b"
  instance_type = "t2.micro"

  tags = {
    Name = "ExampleInstance"
  }
}
- state 파일 생성 및 내용 확인 
- terraform apply 실행 후, Terraform이 terraform.tfstate 파일을 생성하고 리소스 정보를 저장한다.
* 예제
{
  "version": 4,
  "resources": [
    {
      "type": "aws_instance",
      "name": "example",
      "instances": [
        {
          "attributes": {
            "id": "i-0abc123456def7890",
            "ami": "ami-0c1a7f89451184c8b",
            "instance_type": "t2.micro",
            "tags": {
              "Name": "ExampleInstance"
            }
          }
        }
      ]
    }
  ]
}
- state 파일의 원격 관리(원격 저장소 설정 예제)
* 예제
terraform {
  backend "s3" {
# state 파일을 저장할 S3 버킷 이름 
    bucket         = "my-terraform-state"
# S3 내에서 state 파일의 경로
    key            = "terraform.tfstate"
# S3 버킷이 위치한 리전
    region         = "ap-northeast-2"
# 파일 암호화 여부
    encrypt        = true
# Terraform state 잠금 파일을 저장할 DynamoDB 테이블 이름(동시 작업 방지)
    dynamodb_table = "terraform-lock"
  }
}

 

 

5. state 파일 사용 시 유의사항

- 수동 편집 금지 : Terraform 자체가 관리하므로 직접 수정하면 상태가 손상될 수 있다.(백업 필수)
- 버전 관리 필수
- 암호화 
- 잠금 사용 : 동시 실행 방지 위해 활성화 한다.(ex. S3+DynamoDB)