Где бы вы хранили tfstate, если над инфраструктурой работает много разработчиков?

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

Ответ

Для командной работы я всегда настраиваю удаленное backend-хранилище с поддержкой state locking. Локальное хранение файла terraform.tfstate недопустимо в команде, так как приводит к конфликтам, потере состояния и проблемам с безопасностью.

Мой стандартный выбор — AWS S3 в связке с DynamoDB для блокировок.

Почему S3 + DynamoDB:

  1. State Locking (Блокировка состояния): DynamoDB-таблица обеспечивает пессимистичную блокировку state-файла на время операции terraform apply. Это предотвращает одновременное изменение инфраструктуры разными членами команды.
  2. Версионирование и Durability: S3 надежно хранит файл, а включение версионирования (versioning) позволяет откатиться к предыдущему состоянию в случае ошибки.
  3. Шифрование: Можно легко включить шифрование на стороне сервера (SSE-S3 или SSE-KMS) для безопасности чувствительных данных в state.
  4. Доступность: Хранилище централизовано и доступно всем, у кого есть соответствующие IAM-права.

Пример конфигурации backend:

terraform {
  backend "s3" {
    bucket         = "company-terraform-state-prod"
    key            = "network/vpc/terraform.tfstate" # Логическая структура
    region         = "eu-west-1"
    encrypt        = true
    dynamodb_table = "terraform-state-locks"
    # Использую профиль AWS или IAM роль для EC2
  }
}

Альтернативы, которые я использовал в других облаках:

  • Azure: Azure Storage Account (Blob Container) с автоматической блокировкой через Lease Blob.
  • GCP: Google Cloud Storage (GCS) с блокировкой через Cloud Storage Object Lock.
  • Terraform Cloud/Enterprise: Полноценное SaaS/PaaS решение от HashiCorp с интерфейсом, историей изменений, политиками Sentinel. Отлично подходит для крупных организаций.

Ключевой принцип: state должен быть единым источником правды, защищенным и доступным для всей команды.