Как настроить Amazon S3 для хранения state-файла Terraform?

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

Ответ

Хранение Terraform state в S3 с блокировкой через DynamoDB — это стандартный подход в моих проектах для обеспечения консистентности и совместной работы команды.

Пошаговая настройка:

  1. Создание 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
  2. Конфигурация 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
      }
    }
  3. Инициализация. После добавления backend-конфигурации выполняю terraform init. Terraform предложит перенести существующий локальный state в S3.

Важные детали из практики:

  • Ключ (key) лучше структурировать по проектам и окружениям (например, prod/vpc/state, dev/eks/state).
  • Bucket Policy стоит настроить так, чтобы запретить удаление state-файлов всем, кроме админов, и включить MFA Delete для дополнительной защиты.
  • Для разных команд или проектов можно использовать один bucket, но разные ключи и DynamoDB таблицы (или разные атрибуты в одной таблице).