[2] 250909~ 클라우드/[b] 12월 : Terraform + Ansible

[26] tfstate 개념

서버관리자 페페 2026. 1. 7. 21:06

[0]

terraform.tfstate?

Terraform이 알고 있는 현실 인프라의 스냅샷

 

-

 

[1]

tfstate안에 들어 있는 정보

1. 실제 생성된 리소스 정보

-> Terraform 코드에는 없고, apply 이후에만 알 수 있는 현실값 (pointer)

👉 AWS 콘솔에서만 알 수 있는 값들

  • EC2 instance ID
  • ENI ID
  • Subnet ID
  • Security Group ID
  • 실제 할당된 IP
  • RDS endpoint
  • ALB ARN

"resources": [
  {
    "type": "aws_instance",
    "name": "web",
    "instances": [
      {
        "attributes": {
          "id": "i-0abc1234",
          "private_ip": "10.0.1.15",
          "subnet_id": "subnet-aaa",
          ...
        }
      }
    ]
  }
]

 

2. Terraform 리소스 <-> 실제 리소스 매핑 정보

aws_instance.web -> i-0abc1234

이게 없으면 terraform은 이 EC2를 내가 만든건지

지워야 할지, 수정해야 할지를 판단 못함

 

3. 의존성 graph

이 리소스는 어떤 리소스 뒤에 만들어졌는지

어떤 값이 어떤 output을 참고했는지

 

-> 그래프 순서 보장 / 병렬 생성 / 안전한 destroy가 가능

 

4. 민감 정보

- DB password

- IAM role inline Policy

- 일부 Provider 토큰

- user_data 결과

 

-> 이 민감정보 때문에 Git에 올리면 안되고

-> S3 backend + 암호화 + 접근제어 필수

 

-

 

[2]

backend key?

S3 버킷 안에서 tfstate 파일이 저장되는 객체 경로

s3://my-terraform-state-bucket/
 ├── bootstrap/terraform.tfstate
 ├── main/terraform.tfstate
 ├── env/dev/terraform.tfstate
 └── env/prod/terraform.tfstate

 

-

[3]

key의 설계 의미 (아키텍쳐 관점)

 

1.

state isolation

- bootstrap vs main

- dev vs prod

- Network vs APP

key 하나 = Terraform state 하나

 

2.

협업 안정성

- 같은 key를 쓰는 사람 = 같은 인프라

- 실수로 Prod를 건드리는 사고 방지

 

3.

DynamoDB Lock과 1:1 매칭

- key 단위로 Lock

- 한 사람이 apply 중이면 -> 다른 사람 접근 차단

 

* URL 아님 / 디렉터리 개념도 아님 / 그냥 문자열 경로처럼 보이는 object key

 

-

 

[4]

요구사항

- 상태 파일 분실 / 충돌 방지

- 여러 명이 동시에 작업 가능

- env (prod / dev) 분리

- 민감 정보 보호

 

-

 

[5]

아키텍쳐 대응

상태 중앙 관리 : S3 backend

동시 작업 방지 : DynamoDB Lock

환경 분리 : KEY 분리

보안 : S3암호화 + IAM

변경 이력 : Git으로 코드 관리

 

-

 

[6]

그 후 backend

terraform {
	backend "s3" {
    	bucket = "my-tf-state-bucket"
        key = "envs/prod/terraform.tfstate"
        region = "ap-northeast-2"
        dynamodb_table = "my-tf-lock"
        encrypt = true
    }
}

락은 Terraform이 건다

둘 사이를 묶어 주는 것은 Terraform backend 구현 로직

AWS 입장에서는 S3와 DDB 서로 참조 X

Terraform이 같은 작업 세션 안에서 S3에 쓰고, DDB에 락 레코드도 쓰는 것

Terraform이 DDB를 락 서비스로 사용하는 것

 

 

-

 

[7]

실제로 Terraform이 apply에서 하는 일

 

1. DDB에 Lock 생성 (조건부 PutItem)

pre : 조건 / 이미 LockID가 있으면 실패 

- table : my-tf-lock

- key : LockID

- value : 보통 buckey + key 같은 이 state에 대한 고유 식별자를 Terraform이 만들어 쓴다

 

2.

S3에서 state 읽기 / 변경 반영

객체 : s3://my-tf-state-bucket/envs/prod/terraform.tfstate

 

3.

S3에 state 업데이트 저장

 

4.

DDB에서 Lock 삭제

(DeleteItem)

 

-

 

[8]

락의 단위

bucket + key 조합이 이 state를 대표

그래서 보통 Lock도 이 state 파일에 대한 락으로 잡힘

 

IAM권한이 둘 다 필요

Terraform을 실행하는 주체 = AWS CLI Profile / ROLE

-> S3 읽기 쓰기 권한 

-> DDB PutItem / GetItem / DeleteItem

'[2] 250909~ 클라우드 > [b] 12월 : Terraform + Ansible' 카테고리의 다른 글

[28] 리소스 참조  (0) 2026.01.09
[27] backend 실제 구현  (0) 2026.01.09
[25] variables 분리  (0) 2026.01.07
[24] IAMROLE 추가  (0) 2025.12.29
[23] terraform vpc / subnet / igw / rt / sg / ec2  (0) 2025.12.29