Súčasný štart dvoch inštancií Terraform môže viesť ku konfliktom alebo poškodeniu stavu.
sobes.tech AI
Odpoveď od AI
K stavu závodného (race condition) a pravdepodobnému poškodeniu súboru stavu (state file). Je to kritické, pretože Terraform používa súbor stavu na synchronizáciu skutočnej infraštruktúry s konfiguráciou. Poškodenie môže viesť k nesprávnej aplikácii zmien, duplikovaniu zdrojov alebo ich odstráneniu bez ohľadu na plánovaný stav.
Aby sa tomu zabránilo, používa sa blokovanie súboru stavu. Väčšina backendov Terraform (napríklad S3, GCS, Artifactory) podporuje mechanizmus blokovania. Pri pokuse spustiť druhý inštanciu Terraform, zatiaľ čo prvý vykonáva operáciu, druhý čaká na odstránenie blokácie alebo sa ukončí chybou.
Príklad konfigurácie backendu s blokovaním (pre 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žíva sa na blokovanie
}
}
V tomto prípade sa dynamodb_table používa na implementáciu distribuovaného blokovania. Pred vykonaním operácie Terraform sa pokúsi vytvoriť prvok v tejto tabuľke, ktorý slúži ako indikátor zaneprázdnenosti súboru stavu. Iný inštanciu, ktorá sa pokúša získať prístup, uvidí existujúci prvok a nebude môcť získať blokáciu.
Ak blokovanie nie je nakonfigurované alebo sa používa lokálny backend bez podpory blokovania, súčasné vykonávanie povedie k nepředvídateľnému správaniu.
Dôsledky môžu zahŕňať:
- Poškodenie súboru stavu: Záznam údajov od dvoch procesov súčasne môže viesť k jeho nekonzistentnému stavu.
- Nesprávny stav infraštruktúry: Časť zmien môže byť aplikovaná, iná ignorovaná alebo zmenená druhým procesom.
- Duplikovanie zdrojov: Terraform môže vytvoriť zdroje, ktoré považuje za neexistujúce, pretože informácie v súbore stavu ešte neboli aktualizované.
- Odstránenie zdrojov: V zriedkavých prípadoch môže Terraform nesprávne interpretovať stav a odstrániť zdroje, ktoré sú potrebné podľa konfigurácie.
Na zabránenie takýmto situáciám by sa mal vždy používať backend s podporou blokovania a uistiť sa, že je správne nakonfigurovaný. V CI/CD pipeline sa to dosahuje synchronizáciou úloh a zaručením, že iba jeden proces Terraform pracuje s konkrétnym súborom stavu v danom čase.