Что такое tfstate в Terraform?

«Что такое tfstate в Terraform?» — вопрос из категории Terraform, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

tfstate (Terraform State) — это критически важный файл (обычно terraform.tfstate), в котором Terraform хранит привязку между ресурсами, описанными в конфигурационных файлах (.tf), и реальными объектами в облачном провайдере или другой целевой системе. Это внутренняя база данных Terraform.

Зачем он нужен и как используется:

  1. Сопоставление и планирование: При запуске terraform plan Terraform сравнивает желаемое состояние из .tf-файлов с текущим состоянием из tfstate, чтобы построить план изменений — что создать, обновить или уничтожить.
  2. Хранение метаданных: В state хранятся атрибуты ресурсов (например, ID созданного EC2-инстанса, его приватный IP-адрес), которые могут использоваться другими ресурсами через output или terraform_remote_state.
  3. Управление зависимостями: 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 и инфраструктуры.