Ответ
Хранение Terraform state в S3 с блокировкой через DynamoDB — это стандартный подход в моих проектах для обеспечения консистентности и совместной работы команды.
Пошаговая настройка:
-
Создание S3 bucket и DynamoDB таблицы. Я делаю это отдельным "бутстрап"-конфигом Terraform или через AWS CLI для начальной инициализации инфраструктуры управления.
# Создание bucket с версионированием и шифрованием aws s3api create-bucket --bucket my-company-terraform-state --region us-east-1 aws s3api put-bucket-versioning --bucket my-company-terraform-state --versioning-configuration Status=Enabled aws s3api put-bucket-encryption --bucket my-company-terraform-state --server-side-encryption-configuration '{"Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}}]}' # Создание таблицы DynamoDB для блокировок aws dynamodb create-table --table-name terraform-state-locks --attribute-definitions AttributeName=LockID,AttributeType=S --key-schema AttributeName=LockID,KeyType=HASH --billing-mode PAY_PER_REQUEST - Конфигурация backend в основном коде Terraform. Указываю созданные ресурсы.
terraform { backend "s3" { bucket = "my-company-terraform-state" key = "production/network/terraform.tfstate" # Логическая структура папок region = "us-east-1" dynamodb_table = "terraform-state-locks" encrypt = true } } - Инициализация. После добавления backend-конфигурации выполняю
terraform init. Terraform предложит перенести существующий локальный state в S3.
Важные детали из практики:
- Ключ (key) лучше структурировать по проектам и окружениям (например,
prod/vpc/state,dev/eks/state). - Bucket Policy стоит настроить так, чтобы запретить удаление state-файлов всем, кроме админов, и включить MFA Delete для дополнительной защиты.
- Для разных команд или проектов можно использовать один bucket, но разные ключи и DynamoDB таблицы (или разные атрибуты в одной таблице).