Sobes.tech
Middle+

Do czego doprowadzi jednoczesne uruchomienie dwóch instancji Terraform?

sobes.tech AI

Odpowiedź od AI

W odniesieniu do warunku wyścigu (race condition) i prawdopodobnego uszkodzenia pliku stanu (state file). Jest to krytyczne, ponieważ Terraform używa pliku stanu do synchronizacji rzeczywistej infrastruktury z konfiguracją. Uszkodzenie może prowadzić do nieprawidłowego stosowania zmian, duplikowania zasobów lub ich usuwania niezależnie od planowanego stanu.

Aby tego uniknąć, stosuje się blokadę pliku stanu. Większość backendów Terraform (np. S3, GCS, Artifactory) obsługuje mechanizm blokady. Podczas próby uruchomienia drugiej instancji Terraform, podczas gdy pierwsza działa, druga oczekuje na zwolnienie blokady lub kończy się błędem.

Przykład konfiguracji backendu z blokadą (dla S3):

terraform {
  backend "s3" {
    bucket         = "my-terraform-state-bucket"
    key            = "path/to/my/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "my-terraform-lock-table" // Używany do blokady
  }
}

W tym przypadku, dynamodb_table jest używany do implementacji rozproszonej blokady. Przed wykonaniem operacji Terraform próbuje utworzyć element w tej tabeli, który służy jako wskaźnik zajętości pliku stanu. Inny proces próbujący uzyskać dostęp zobaczy istniejący element i nie będzie mógł uzyskać blokady.

Jeśli blokada nie jest skonfigurowana lub używany jest lokalny backend bez obsługi blokad, równoczesne wykonanie może prowadzić do nieprzewidywalnych zachowań.

Konsekwencje mogą obejmować:

  • Uszkodzenie pliku stanu: Zapis danych przez dwa procesy jednocześnie może prowadzić do niespójnego stanu.
  • Nieprawidłowy stan infrastruktury: Niektóre zmiany mogą zostać zastosowane, inne zignorowane lub zmienione przez drugi proces.
  • Duplikacja zasobów: Terraform może utworzyć zasoby, które uważa za nieistniejące, ponieważ informacje w pliku stanu jeszcze nie zostały zaktualizowane.
  • Usunięcie zasobów: W rzadkich przypadkach, błędnie interpretując stan, Terraform może usunąć zasoby niezbędne według konfiguracji.

Aby zapobiec takim sytuacjom, zawsze należy używać backendu obsługującego blokady i upewnić się, że jest poprawnie skonfigurowany. W pipeline'ach CI/CD osiąga się to poprzez synchronizację zadań i gwarancję, że tylko jeden proces Terraform pracuje z plikiem stanu w danym momencie.