State là bản đồ giữa địa chỉ resource trong code và ID thật ở provider, cộng với snapshot attribute của lần apply gần nhất.
json
{
"type": "aws_db_instance",
"name": "main",
"instances": [{ "attributes": { "id": "db-prod-01", "password": "s3cr3t" } }]
}Không có state, Terraform không biết aws_db_instance.main ứng với DB nào nên apply sẽ tạo mới thay vì update.
Lý do không commit vào Git:
- State chứa plaintext secret — password RDS sinh tự động, private key, token. Commit là leak.
- Git không có locking, hai người apply song song sẽ hỏng state chứ không phải conflict text.
- State đổi mỗi lần apply, làm diff repo vô nghĩa.
Chỗ đúng để cất là remote backend có encryption + versioning + locking (S3 + DynamoDB, GCS, Terraform Cloud). Local state chỉ hợp cho demo hoặc bootstrap.