Terraform State는 "현재 인프라의 실체를 기억하는 파일"이다.
Terraform은 이 파일을 기준으로 작성한 코드와 실제 존재하는 인프라를 비교하고 동기화한다.
코드만 보고 움직이는 것이 아니라, 항상 State를 통해 인프라를 보고 판단한다.
만약 Terraform이 State 없이 매번 클라우드 API를 호출해 전체 인프라를 조회한다면
이런 문제가 생긴다.
→ Terraform은 최소한의 정보를 State에 기억해두고, 필요한 변경만 빠르게 계산한다.
State 파일(terraform.tfstate)은 기본적으로 JSON 형식이다.
{
"resources": [
{
"type": "aws_instance",
"name": "example",
"instances": [
{
"attributes": {
"id": "i-0abcd1234efgh5678", # 실제 생성된 인스턴스의 ID
"instance_type": "t2.micro",
"ami": "ami-12345678",
"tags": {
"Name": "example-instance"
}
}
}
]
}
]
}
Terraform은 이 생성된 리소스의 ID를 기억하고, Plan/Apply 시 이 리소스를 추적한다.
Terraform은 Plan을 실행할 때 State, 코드, 클라우드 실상을 동시에 비교한다.
이렇게 속성 단위로 세밀하게 비교하여 변경 계획을 만든다.
State에는 t2.micro, 실제 AWS에는 t3.micro로 변경 → Plan에 수정(~) 표시
※ Apply시 코드 기반으로 수정되니 주의
Drift란 "코드 수정 없이, 인프라가 수작업 등으로 변경된 경우"를 의미한다.
Terraform은 Provider API(AWS, GCP 등)를 호출해서 실시간 상태를 가져오고 State와 비교해 Drift를 감지한다.
※ 일부 Provider는 필드를 완벽히 반환하지 않으므로, 정확한 감지를 위해 terraform refresh를 병행하는 것이 안전하다.
Terraform은 리소스 Dependency를 분석해서
DAG(Directed Acyclic Graph) 형태로 적용 순서를 최적화한다.
VPC → Subnet → EC2 인스턴스 이런 순서로 리소스를 안전하게 생성하거나 수정한다.
| 단계 | 상세 동작 |
|---|---|
| 1 | State 파일을 읽어 기억된 상태 로딩 |
| 2 | 코드(.tf)를 파싱해 원하는 상태 생성 |
| 3 | Provider API 호출로 현재 클라우드 상태 조회 |
| 4 | Diff Engine으로 field-by-field 비교 |
| 5 | 변경사항을 기반으로 Plan 출력 |
| 6 | 의존성 그래프를 따라 적용 순서 최적화 |
Terraform은 Code, State, 그리고 인프라 상태를 교차검증하여, 가장 안전하고 최소한의 변경만 계획하고 적용한다.