Text size
Ausprobiert & getestet6 Min. Lesezeit

Terraformzustand, erklärt

Die Datei, die alles über Ihre Infrastruktur weiß und wie man sie schützt.

Terraform state, explained
KI-generierte Illustration

Wenn man mit Terraform beginnt, konzentriert man sich auf die .tf - Die Akten. Die Ressourcen, die Module, die Variablen. Die Zustandsakte ist nur etwas, das nach dem ersten erscheint applyDie meisten denken nicht darüber nach, bis etwas schief geht.

Und irgendwann geht immer etwas schief. Eine verlorene Staatsakte, eine beschädigte, zwei Personen, die gleichzeitig beantragt haben, ein Geheimnis durch den Staat durchgesickert. Verständnis ist das, was Terraform von Vertrauen unterscheidet. (OpenTofu funktioniert auf dieselbe Weise.)

Was ist eigentlich der Zustand

Terraforms Zustand ist eine JSON-Datei, die Ihren Code mit realen Ressourcen verknüpft.

Wenn du schreibst resource "aws_s3_bucket" "logs", Terraform muss sich daran erinnern , dass dieser bestimmte Block entspricht dem Eimer mit ID acme-logs-prod in Ihrem AWS-Konto. Diese Kartierung, plus die letzten bekannten Attribute jeder Ressource, ist der Zustand.

Terraform verwendet es:

  • Wissen, was existiert, so dass es die richtigen Ressourcen aktualisieren oder löschen kann.
  • Berechnen Sie den Plan Durch den Vergleich von Code, Zustand und Realität.
  • Spurabhängigkeiten und Outputs zwischen Ressourcen.
  • Wir müssen die Dinge beschleunigen., indem man nicht jedes Mal alles von vorne aufsucht.

Ohne Staat weiß Terraform nicht, welche Ressourcen sie verwaltet. Löschen Sie die Zustanddatei, und Terraform wird versuchen, alles neu zu erstellen, während die alten Ressourcen weiter laufen, unverwaltet.

Fernzustand, immer

Für alles, was über ein persönliches Experiment hinausgeht, halten Sie den Zustand in einem Remote-Backend mit Sperrung:

  • S3 (mit nativen Schließdateien), Google Cloud Speicherung, Azure Blob-Speicher
  • HCP Terraform oder andere Plattformen zur Automatisierung der Infrastruktur

Das Sperren verhindert, dass zwei Personen (oder Pipelines) gleichzeitig anwendbar sind und den Zustand beschädigen. Versionen auf dem Eimer geben dir eine Geschichte, um dich von Fehlern zu erholen.

Ihre Staatsakte ist die Erinnerung Ihrer Infrastruktur. Verliert man ihn, wacht Terraform mit Gedächtnisverlust in einem Haus voller Fremde auf.

Es geheim halten.

Die staatlichen Akten enthalten oft Geheimnisse in einfachem Text: Datenbankpasswörter, private Schlüssel, Token oder alles, was eine Ressource als Attribut zurückgibt. Selbst wenn Sie eine Variable als sensitive, ist es in der Plan-Ausgabe versteckt, nicht in der Zustanddatei.

Der Staat schützt wie Geheimnisse:

  • Verschlüsselung in Ruhe auf dem Lagerbehälter.
  • Strenge Zugangskontrolle: nur die Pipeline und ein paar Administratoren können den Produktionszustand lesen.
  • Verpflichten Sie niemals einen Zustand an Git. Hinzufügen *.tfstate und *.tfstate.backup zu .gitignore.
  • Die Client-Seite von OpenTofu Verschlüsselt den Zustand, bevor er Ihre Maschine oder Pipeline verlässt, mit einem KMS-Schlüssel.
  • Die kurzlebigen Ressourcen von Terraform und die Argumente für die Schreibfreiheit Geheime Werte aus dem Staat zu halten.
  • Geheimnisse außerhalb von Terraform erzeugen. Wenn möglich, in einem geheimen Manager und nur Empfehlungen weitergeben.

Umzug und Neufaktorisierung

Die Umbenennung einer Ressource oder die Verlegung in ein Modul ändert ihre Adresse. Ohne Terraform zu informieren, würde es die alte Ressource zerstören und eine neue erzeugen. Für eine Datenbank ist das eine Katastrophe.

Modern Terraform verarbeitet das in Code mit moved Blöcke:

moved {
  from = aws_s3_bucket.logs
  to   = module.logging.aws_s3_bucket.this
}

Der Plan zeigt einen Zug statt Zerstören und Erstellen. Weil es in Code ist, wird es überprüft und funktioniert in jeder Umgebung. Viel sicherer als die älteren terraform state mv Kommando.

Einfuhr bestehender Ressourcen

Um eine manuell erstellte Ressource unter die Verwaltung von Terraform zu bringen, import Blöcke:

import {
  to = aws_s3_bucket.legacy
  id = "acme-legacy-bucket"
}

Lauf ! terraform plan -generate-config-out=generated.tf und Terraform schreibt sogar einen ersten Entwurf der Ressourcenkonfiguration. Reinigen, planen und bewerben.

Abbau von Ressourcen aus der Verwaltung

Manchmal möchten Sie, dass Terraform die Verwaltung einer Ressource beendet, ohne sie zu löschen, zum Beispiel wenn sie an einen anderen Stapel übergeben wird. Verwenden Sie eine removed Einheit:

removed {
  from = aws_s3_bucket.handover

  lifecycle {
    destroy = false
  }
}

Die Ressource bleibt in der Cloud. Terraform vergisst es einfach.

Wenn es bricht

Ein paar Situationen und was zu tun ist:

  • Verfallene Schleuse Nach einem abgestürzten Rohrleitung: terraform force-unlock <lock-id>, aber erst, nachdem überprüft, dass nichts tatsächlich läuft.
  • Korrekt oder fehlerhafter Zustand: eine vorherige Version aus der Versionsgeschichte des Buckets wiederherstellen. Deshalb ist Versionen wichtig.
  • Der Zustand ist nicht in Einklang mit der Realität: terraform plan -refresh-only zeigt die Unterschiede, und terraform apply -refresh-only Die Daten werden in einem neuen System aktualisiert, um der Realität zu entsprechen, ohne die Infrastruktur zu verändern.
  • Ich muss den Zustand überprüfen.: terraform state list und terraform state show <address> sind sichere, nur lesbare Möglichkeiten, nach innen zu schauen.

Vermeiden Sie die manuelle Bearbeitung des JSON. Wenn du es wirklich musst, nimm erst eine Verstärkung und weißt, dass du alleine bist.

Was sollten Sie heute überprüfen?

Ist jede State-Datei remote, gesperrt, versioniert und verschlüsselt? Wer hat Zugang zum Produktionsstand? Nehmen Sie noch state mv Kommandos statt moved - Die Blöcke? Diese drei Fragen decken den größten Teil des Risikos ab.

Meine Meinung: Behandeln Sie den Staat als die sensibelste Datei in Ihrer Infrastruktur. Schützen Sie es, verändern Sie es und lassen Sie es nie auf einem Laptop leben.

Desly