Ответ
Terraform предотвращает параллельное выполнение, блокируя файл состояния (state file). Я всегда настраиваю удаленный бэкенд с поддержкой блокировок (state locking).
Как это работает на практике:
- Когда я выполняю
terraform apply, Terraform сначала пытается получить эксклюзивную блокировку для текущего состояния в бэкенде. - Если блокировка получена, операция продолжается. Файл состояния обновляется, и блокировка снимается.
- Если другой участник команды в это время запустит свою команду
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 автоматически создает и удаляет в ней запись при операциях.
Важно: Без такой настройки параллельные запуски могут привести к повреждению состояния и неконсистентности инфраструктуры.