Sobes.tech
Middle+

Het gelijktijdig starten van twee Terraform-instanties kan leiden tot conflicten of corruptie van de staat.

sobes.tech AI

Antwoord van AI

Met betrekking tot race conditions en het mogelijke beschadigen van het state-bestand. Dit is kritisch omdat Terraform het state-bestand gebruikt om de daadwerkelijke infrastructuur te synchroniseren met de configuratie. Beschadiging kan leiden tot onjuiste toepassing van wijzigingen, duplicatie van resources of het verwijderen ervan, ongeacht de geplande staat.

Om dit te voorkomen, wordt een lock-mechanisme voor het state-bestand gebruikt. De meeste Terraform-backends (bijvoorbeeld S3, GCS, Artifactory) ondersteunen een lock-mechanisme. Wanneer geprobeerd wordt een tweede instantie van Terraform te starten terwijl de eerste nog actief is, wacht de tweede tot de lock wordt vrijgegeven of eindigt met een fout.

Voorbeeld van een backend-configuratie met locking (voor 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" // Gebruikt voor locking
  }
}

In dit geval wordt dynamodb_table gebruikt om een gedistribueerde lock te implementeren. Voordat een operatie wordt uitgevoerd, probeert Terraform een item te maken in deze tabel, dat dient als indicator dat het state-bestand in gebruik is. Een andere instantie die probeert toegang te krijgen, ziet het bestaande item en kan de lock niet verkrijgen.

Als locking niet is ingesteld of als een lokale backend zonder lock-ondersteuning wordt gebruikt, kan gelijktijdige uitvoering leiden tot onvoorspelbaar gedrag.

De gevolgen kunnen onder andere zijn:

  • Beschadiging van het state-bestand: Gelijktijdige gegevensschrijvingen door twee processen kunnen leiden tot een inconsistente staat.
  • Onjuiste infrastructuurstatus: Sommige wijzigingen worden mogelijk toegepast, andere genegeerd of gewijzigd door het tweede proces.
  • Duplicatie van resources: Terraform kan resources creëren die het niet bestaat, omdat de informatie in het state-bestand nog niet is bijgewerkt.
  • Verwijdering van resources: In zeldzame gevallen kan Terraform resources verwijderen die volgens de configuratie nodig zijn, door een verkeerd geïnterpreteerde staat.

Om dergelijke situaties te voorkomen, moet altijd een backend worden gebruikt dat locking ondersteunt en correct worden geconfigureerd. In CI/CD-pijplijnen wordt dit bereikt door taak-synchronisatie en het garanderen dat slechts één Terraform-proces met een state-bestand werkt op een bepaald moment.