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

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

Ответ

Terraform предотвращает параллельное выполнение, блокируя файл состояния (state file). Я всегда настраиваю удаленный бэкенд с поддержкой блокировок (state locking).

Как это работает на практике:

  1. Когда я выполняю terraform apply, Terraform сначала пытается получить эксклюзивную блокировку для текущего состояния в бэкенде.
  2. Если блокировка получена, операция продолжается. Файл состояния обновляется, и блокировка снимается.
  3. Если другой участник команды в это время запустит свою команду terraform apply, его клиент увидит ошибку:
    Error: Error acquiring the state lock
    Lock Info:
    ID:        1234abcd-5678...
    Path:      my-bucket/path/to/state.tfstate
    Operation: OperationTypeApply
    Who:       user@workstation
    Created:   2023-10-26 12:34:56.789 +0000 UTC
    Info:

    Операция не начнется, пока блокировка не будет освобождена (автоматически после завершения первой операции или вручную через terraform force-unlock).

Пример настройки бэкенда S3 с блокировкой через DynamoDB (AWS):

# backend.tf
terraform {
  backend "s3" {
    bucket         = "company-terraform-state-prod"
    key            = "network/terraform.tfstate"
    region         = "eu-west-1"
    encrypt        = true
    dynamodb_table = "terraform-state-locks" # Таблица для блокировок
  }
}

Таблица DynamoDB должна иметь строковый первичный ключ с именем LockID. Terraform автоматически создает и удаляет в ней запись при операциях.

Важно: Без такой настройки параллельные запуски могут привести к повреждению состояния и неконсистентности инфраструктуры.