Sobes.tech
Middle+

K čemu povede současný spuštění dvou instancí Terraformu?

sobes.tech AI

Odpověď od AI

Pokud jde o race condition (stav, kdy více procesů přistupuje ke stejnému souboru současně) a pravděpodobné poškození souboru stavu (state file). To je kritické, protože Terraform používá soubor stavu k synchronizaci skutečné infrastruktury s konfigurací. Poškození může vést k nesprávnému použití změn, duplicitě zdrojů nebo jejich odstranění bez ohledu na plánovaný stav.

Aby se tomu zabránilo, používá se zámek souboru stavu. Většina backendů Terraform (například S3, GCS, Artifactory) podporuje mechanismus zámku. Při pokusu spustit druhou instanci Terraform, zatímco první je aktivní, druhá čeká na uvolnění zámku nebo skončí chybou.

Příklad konfigurace backendu s zámkem (pro 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" // Používá se pro zámek
  }
}

V tomto případě je dynamodb_table používán k implementaci distribuovaného zámku. Před provedením operace se Terraform pokusí vytvořit prvek v této tabulce, který slouží jako indikátor, že soubor stavu je používán. Jiný proces, který se pokusí získat přístup, uvidí existující prvek a nemůže získat zámek.

Pokud není zámek nakonfigurován nebo je použit lokální backend bez podpory zámku, může současné spuštění vést k nepředvídatelnému chování.

Důsledky mohou zahrnovat:

  • Poškození souboru stavu: Zápis dat dvěma procesy najednou může vést ke nekonzistentnímu stavu.
  • Nesprávný stav infrastruktury: Některé změny mohou být aplikovány, jiné ignorovány nebo změněny druhým procesem.
  • Duplicitní zdroje: Terraform může vytvořit zdroje, které považuje za neexistující, protože informace v souboru stavu ještě nebyly aktualizovány.
  • Odstranění zdrojů: Ve vzácných případech může Terraform nesprávně interpretovat stav a odstranit potřebné zdroje.

Aby se předešlo takovým situacím, je třeba vždy používat backend s podporou zámku a správně jej nakonfigurovat. V CI/CD pipelinech je to dosaženo synchronizací úkolů a zajištěním, že pouze jeden proces Terraform pracuje s daným souborem stavu v daný okamžik.