Ответ
Для командной работы я всегда настраиваю удаленное backend-хранилище с поддержкой state locking. Локальное хранение файла terraform.tfstate недопустимо в команде, так как приводит к конфликтам, потере состояния и проблемам с безопасностью.
Мой стандартный выбор — AWS S3 в связке с DynamoDB для блокировок.
Почему S3 + DynamoDB:
- State Locking (Блокировка состояния): DynamoDB-таблица обеспечивает пессимистичную блокировку state-файла на время операции
terraform apply. Это предотвращает одновременное изменение инфраструктуры разными членами команды. - Версионирование и Durability: S3 надежно хранит файл, а включение версионирования (versioning) позволяет откатиться к предыдущему состоянию в случае ошибки.
- Шифрование: Можно легко включить шифрование на стороне сервера (SSE-S3 или SSE-KMS) для безопасности чувствительных данных в state.
- Доступность: Хранилище централизовано и доступно всем, у кого есть соответствующие 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 должен быть единым источником правды, защищенным и доступным для всей команды.