Két Terraform példány egyidejű indítása konfliktushoz vagy állapotkárosodáshoz vezethet.
sobes.tech MI
Válasz az MI-től
A versenyhelyzet (race condition) és az állapotfájl (state file) valószínű sérülése kapcsán. Ez kritikus, mivel a Terraform az állapotfájlt használja a valódi infrastruktúra szinkronizálására a konfigurációval. A sérülés hibás alkalmazáshoz, erőforrások duplikálásához vagy azok törléséhez vezethet, függetlenül a tervezett állapottól.
Ennek elkerülése érdekében az állapotfájl zárolását alkalmazzák. A Terraform legtöbb backendje (pl. S3, GCS, Artifactory) támogatja a zárolási mechanizmust. Amikor megpróbál egy második példányt futtatni, miközben az első működik, a második vár a zárolás feloldására vagy hibával ér véget.
Példa a zárolással ellátott backend konfigurációra (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" // A zároláshoz használva
}
}
Ebben az esetben a dynamodb_table a terjesztett zárolás megvalósítására szolgál. Mielőtt műveletet hajtana végre, a Terraform megpróbál létrehozni egy elemet ebben a táblában, ami a státuszként szolgál, hogy a fájl használatban van. Egy másik példány, amely hozzáférést próbál szerezni, látja a meglévő elemet, és nem tudja megszerezni a zárolást.
Ha a zárolás nincs konfigurálva, vagy helyi backendet használnak zárolás támogatása nélkül, a párhuzamos végrehajtás kiszámíthatatlan viselkedéshez vezethet.
A következmények a következők lehetnek:
- A státuszkép sérülése: Két folyamat egyidejű adatírása inkonzisztens állapothoz vezethet.
- Helytelen infrastruktúra állapota: Néhány változtatás alkalmazható, másokat figyelmen kívül hagynak vagy módosítanak a második folyamat által.
- Erőforrások duplikálása: A Terraform létrehozhat erőforrásokat, amelyeket nem tart számon, mert az információk a státuszképen még nem frissültek.
- Erőforrások törlése: Ritka esetekben a Terraform a helytelen értelmezés miatt törölheti a szükséges erőforrásokat.
Az ilyen helyzetek elkerülése érdekében mindig olyan backendet kell használni, amely támogatja a zárolást, és megfelelően konfigurálni kell. CI/CD folyamatokban ez a feladatok szinkronizálásával és az biztosításával érhető el, hogy csak egy Terraform folyamat dolgozik egy adott állományon egy időben.