Ответ
tfstate (Terraform State) — это критически важный файл (обычно terraform.tfstate), в котором Terraform хранит привязку между ресурсами, описанными в конфигурационных файлах (.tf), и реальными объектами в облачном провайдере или другой целевой системе. Это внутренняя база данных Terraform.
Зачем он нужен и как используется:
- Сопоставление и планирование: При запуске
terraform planTerraform сравнивает желаемое состояние из.tf-файлов с текущим состоянием изtfstate, чтобы построить план изменений — что создать, обновить или уничтожить. - Хранение метаданных: В state хранятся атрибуты ресурсов (например, ID созданного EC2-инстанса, его приватный IP-адрес), которые могут использоваться другими ресурсами через
outputилиterraform_remote_state. - Управление зависимостями: State отслеживает неявные зависимости между ресурсами, которые не описаны явно в коде.
Пример структуры state-файла (JSON):
{
"version": 4,
"terraform_version": "1.6.0",
"serial": 92,
"lineage": "a1b2c3d4-...",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "aws_instance",
"name": "app_server",
"provider": "provider["registry.terraform.io/hashicorp/aws"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"id": "i-0abc123def456",
"ami": "ami-0c55b159cbfafe1f0",
"instance_type": "t2.micro",
"private_ip": "10.0.1.5"
}
}
]
}
]
}
Ключевые практики для DevOps:
- Никогда не храните state локально в CI/CD. Используйте удаленный бэкенд (Remote Backend) — Amazon S3 + DynamoDB для блокировок, Terraform Cloud, Azure Storage Account, Google Cloud Storage. Это обеспечивает консистентность state для всей команды.
- Защищайте state. Он может содержать чувствительные данные (пароли БД, приватные ключи) в открытом виде. Шифруйте бэкенд (например, S3 Server-Side Encryption) и строго ограничивайте доступ по IAM.
- Используйте блокировки (State Locking). Механизм, подобный DynamoDB table для AWS, предотвращает одновременное выполнение
terraform applyразными пользователями, что могло бы привести к повреждению state и инфраструктуры.