← Назад к вопросам

Как происходит, что два оператора не запускают Terraform одновременно

2.0 Middle🔥 161 комментариев
#CI/CD и автоматизация#Облачные технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Предотвращение одновременного запуска Terraform

Это один из критических аспектов управления инфраструктурой. Одновременное выполнение операций может привести к конфликтам состояния, потере данных и нарушению консистентности инфраструктуры.

State Locking (Блокировка состояния)

Терраформ поддерживает механизм блокировки состояния для предотвращения одновременного доступа к state файлу. Это автоматически работает с удаленными backends.

# При terraform init с remote backend
terraform init -backend=true
# Terraform автоматически использует блокировку

# Просмотр информации о блокировке
terraform force-unlock ID

Backends с встроенной блокировкой

Terraform Cloud/Enterprise — встроенная блокировка и управление состоянием.

AWS S3 с DynamoDB — S3 для хранения state, DynamoDB для блокировки.

terraform {
  backend "s3" {
    bucket           = "my-terraform-state"
    key              = "prod/terraform.tfstate"
    region           = "us-east-1"
    dynamodb_table   = "terraform-locks"
    encrypt          = true
  }
}

Azure Blob Storage — встроенная блокировка при использовании как backend.

Google Cloud Storage — поддерживает состояние с блокировкой.

Как работает блокировка

  1. Приобретение блокировки — при terraform plan/apply блокировка автоматически захватывается
  2. Операция — только процесс с блокировкой может модифицировать состояние
  3. Отпуск блокировки — после завершения операции блокировка освобождается
  4. Timeout — если процесс зависнет, блокировка может быть принудительно освобождена

Процедурные подходы

CI/CD pipeline контроль — только CI/CD система может запускать terraform apply в production.

# GitLab CI пример
apply:
  script:
    - terraform init
    - terraform plan -out=tfplan
    - terraform apply tfplan
  only:
    - main
  when: manual  # Требует ручного подтверждения

Организационные политики — явный процесс согласования изменений инфраструктуры.

Code review — все изменения infrastructure-as-code проходят через pull request.

Практический пример конфигурации

terraform {
  required_version = ">= 1.0"
  
  backend "s3" {
    bucket           = "company-terraform-state"
    key              = "production/terraform.tfstate"
    region           = "eu-west-1"
    dynamodb_table   = "terraform-state-locks"
    encrypt          = true
    skip_credentials_validation = false
  }
}

Мониторинг и отладка

# Проверка статуса блокировки
aws dynamodb scan --table-name terraform-locks

# Если блокировка зависла
terraform force-unlock LOCK_ID

# Вывод информации о состоянии
terraform state list
terraform state show resource.name

Лучшие практики

  • Всегда использовать remote backend с встроенной блокировкой
  • DynamoDB для AWS — надежный и дешевый способ управления блокировками
  • Terraform Cloud для enterprise — полное управление состоянием и политиками
  • Никогда не использовать local состояние в production
  • Мониторить stuck locks и иметь процедуру их разрешения
  • Ограничивать доступ к state файлам и DynamoDB таблице

В моей практике я использую комбинацию S3 + DynamoDB для state locking в AWS, и это обеспечивает надежное предотвращение race conditions. Для Terraform Cloud у них есть встроенное управление состоянием с полной историей и откатом операций.