Ką sukels dviejų Terraform egzempliorių vienu metu paleidimas?
sobes.tech AI
Atsakymas iš AI
Dėl lenktynių sąlygos (race condition) ir galimo būsenos failo (state file) sugadinimo. Tai yra kritiška, nes Terraform naudoja būsenos failą sinchronizuoti tikrąją infrastruktūrą su konfigūracija. Sugadinimas gali sukelti netinkamą pakeitimų taikymą, išteklių dubliavimą ar jų ištrynimą nepriklausomai nuo planuojamos būsenos.
Siekiant to išvengti, naudojamas būsenos failo užrakinimas. Dauguma Terraform backend'ų (pvz., S3, GCS, Artifactory) palaiko užrakinimo mechanizmą. Bandant paleisti antrą Terraform egzempliorių, kol pirmasis vykdo operaciją, antrasis laukia užrakinimo atlaisvinimo arba baigiasi klaida.
Pavyzdys, kaip konfigūruoti backend'ą su užrakinimu (S3 atveju):
terraform {
backend "s3" {
bucket = "my-terraform-state-bucket"
key = "path/to/my/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "my-terraform-lock-table" // Naudojama užrakinimui
}
}
Šiuo atveju, dynamodb_table naudojama paskirstytam užrakinimui įgyvendinti. Prieš vykdant Terraform operaciją, jis bando sukurti elementą šioje lentelėje, kuris rodo, kad būsenos failas yra užimtas. Kitas egzempliorius, bandantis pasiekti, matys esamą elementą ir negalės gauti užrakinimo.
Jei užrakinimas nėra sukonfigūruotas arba naudojamas vietinis backend'as be užrakinimo palaikymo, vienalaikis vykdymas gali sukelti nenuspėjamą elgesį.
Galimi padariniai:
- Būsenos failo sugadinimas: Du procesai vienu metu rašo duomenis, kas gali sukelti jo nesuderinamumą.
- Netinkama infrastruktūros būklė: Kai kurie pakeitimai gali būti taikomi, kiti ignoruojami arba pakeisti kitu procesu.
- Resursų dubliavimas: Terraform gali sukurti resursus, kurie atrodo neegzistuojantys, nes informacija būsenos faile dar nebuvo atnaujinta.
- Resursų ištrynimas: Retais atvejais, neteisingai interpretuojant būseną, Terraform gali ištrinti reikalingus resursus.
Siekiant išvengti tokių situacijų, visada naudokite užrakinimo palaikymą turinčius backend'us ir įsitikinkite, kad jis yra tinkamai sukonfigūruotas. CI/CD pipeline'ose tai pasiekiama sinchronizuojant užduotis ir užtikrinant, kad tik vienas Terraform procesas dirba su konkrečiu būsenos failu šiuo metu.