Sobes.tech
Middle+

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.