Wenn Ihre Terraform-Statusdatei verschwindet: Wiederherstellungsstrategien, die wirklich funktionieren
Sie führen terraform plan aus und statt der gewohnten Ausgabe erhalten Sie eine Fehlermeldung. Die Statusdatei fehlt. Oder ist beschädigt. Oder von einem Prozess gesperrt, der vor Stunden abgestürzt ist. Ihr erster Impuls mag Panik sein, aber hier ist, was Sie wissen müssen: Ihre Infrastruktur läuft wahrscheinlich noch einwandfrei. Die Server, Datenbanken und Load Balancer sind noch da. Was kaputt ist, ist die Aufzeichnung dessen, was Terraform für existent hält.
Diese Situation ist selten, aber wenn sie eintritt, frieren Teams ein. Sie können keine Änderungen mehr über Code vornehmen, bis der Status wiederhergestellt ist. Die gute Nachricht ist, dass eine Wiederherstellung möglich ist, und ein Plan zu haben, macht den Unterschied zwischen einer schnellen Lösung und einer stundenlangen Krise aus.
Warum Statusdateien kaputtgehen
Statusdateien versagen auf einige vorhersehbare Arten. Am häufigsten ist das versehentliche Löschen. Jemand räumt einen S3-Bucket auf und merkt nicht, dass die Statusdatei darin war. Ein weiteres Szenario ist die Beschädigung durch einen Schreibvorgang, der mitten im Prozess unterbrochen wurde. Netzwerkprobleme, Stromausfälle oder abrupte Prozessabbrüche können eine halb geschriebene und unlesbare Statusdatei hinterlassen.
Dann gibt es noch das Sperrproblem. Terraform sperrt Statusdateien, um zu verhindern, dass mehrere Prozesse gleichzeitig schreiben. Wenn ein Prozess stirbt, ohne seine Sperre freizugeben, bleibt diese Sperre bestehen. Jedes nachfolgende plan oder apply schlägt fehl, weil Terraform denkt, dass noch jemand arbeitet.
Der Schweregrad variiert, aber das Kernproblem ist dasselbe: Sie haben die Verbindung zwischen Ihrem Code und Ihrer laufenden Infrastruktur verloren.
Zuerst: Nicht alles neu aufbauen
Die wichtigste Regel ist, dem Drang zu widerstehen, alles abzureißen und neu zu beginnen. Ihre Infrastruktur ist noch betriebsbereit. Der Cloud-Anbieter weiß noch von jeder Ressource, die Sie erstellt haben. Was fehlt, ist Terraforms lokale Aufzeichnung dieser Ressourcen.
Wenn Sie terraform destroy ausführen und alles neu erstellen, verursachen Sie unnötige Ausfallzeiten und riskieren Datenverlust. Datenbanken werden gelöscht. Persistente Volumes werden gelöscht. DNS-Einträge ändern sich. Der Wiederherstellungspfad besteht darin, den Status wiederherzustellen, nicht die Infrastruktur neu aufzubauen.
Wiederherstellung nach Schweregrad
Gesperrter Status: Die einfache Lösung
Hier ist ein Entscheidungsbaum, der Ihnen hilft, Ihren Wiederherstellungspfad basierend auf der Art des Statusdateiproblems schnell zu identifizieren:
Wenn die Statusdatei existiert, aber gesperrt ist, ist dies das einfachste Szenario. Finden Sie heraus, welcher Prozess die Sperre hält. Wenn dieser Prozess noch läuft, lassen Sie ihn beenden. Wenn er unerwartet gestorben ist, verwenden Sie den Befehl force-unlock:
terraform force-unlock <lock_id>
Aber seien Sie vorsichtig. Force-Unlock ist nur sicher, wenn Sie absolut sicher sind, dass kein anderer Prozess in den Status schreibt. Wenn zwei Prozesse gleichzeitig schreiben, erhalten Sie einen beschädigten Status, der schwieriger zu beheben ist als eine einfache Sperre.
Gelöschter Status mit Backup: Das ideale Szenario
Wenn die Statusdatei gelöscht wurde, Sie aber ein Backup haben, sind Sie gut aufgestellt. Die Wiederherstellung ist unkompliziert: Stellen Sie das Backup am ursprünglichen Speicherort wieder her.
Aus diesem Grund ist die Versionierung Ihres Status-Backends entscheidend. Wenn Sie S3 verwenden, aktivieren Sie die Bucket-Versionierung. Wenn eine Datei gelöscht wird, können Sie die vorherige Version direkt über die S3-Konsole oder CLI wiederherstellen. Keine Backup-Dateiverwaltung erforderlich.
Wenn Sie keine Versionierung haben, funktionieren auch manuelle Backups an einem separaten Ort. Der Schlüssel ist, eine Kopie zu haben, die woanders als am primären Statusspeicherort gespeichert ist.
Beschädigter oder fehlender Status ohne Backup: Der harte Weg
Hier wird es schmerzhaft. Sie haben kein Backup, und die Statusdatei ist entweder unlesbar oder weg. Aber Ihre Infrastruktur läuft noch. Die Lösung besteht darin, den Status neu aufzubauen, indem Sie jede Ressource einzeln importieren.
Terraform hat einen import-Befehl, der die vorhandene Infrastruktur ausliest und zu Ihrer Statusdatei hinzufügt. Für jede in Ihrem Code definierte Ressource führen Sie aus:
Um beispielsweise eine EC2-Instanz zu importieren, die in Ihrer Konfiguration als aws_instance.web definiert ist, würden Sie Folgendes ausführen:
terraform import aws_instance.web i-1234567890abcdef0
Die Ressourcenadresse (aws_instance.web) muss exakt mit dem übereinstimmen, was Sie in Ihren .tf-Dateien haben. Wenn sich die Ressource in einem Modul befindet, verwenden Sie den Modulpfad, wie module.my_module.aws_instance.web. Führen Sie nach dem Import terraform plan aus, um zu bestätigen, dass der Status mit Ihrer Konfiguration übereinstimmt.
Das Format der Ressourcen-ID hängt vom Anbieter ab. Für AWS könnte es eine Instanz-ID oder eine ARN sein. Für GCP ist es normalerweise der Ressourcenname oder eine vollständige URL.
Dieser Prozess ist für große Infrastrukturen mühsam. Wenn Sie Dutzende von EC2-Instanzen, RDS-Datenbanken, Load Balancer und Sicherheitsgruppen haben, werden Sie eine Weile lang Importbefehle ausführen. Aber es ist der einzige Weg, Ihren Code mit der Realität in Einklang zu bringen, ohne etwas zu zerstören.
Totalverlust ohne Wiederherstellungsmöglichkeit: Die Atomoption
Manchmal ist der Status weg, Backups existieren nicht, und die Infrastruktur ist zu komplex oder schlecht dokumentiert, um sie Stück für Stück zu importieren. In diesem Fall haben Sie eine Option: von Grund auf neu aufbauen.
Das bedeutet, alle vorhandenen Ressourcen zu zerstören und aus Ihrem Terraform-Code neu zu erstellen. Das ist keine Entscheidung, die man leichtfertig trifft, besonders für Produktionsumgebungen. Aber wenn eine Wiederherstellung durch Import nicht machbar ist, ist ein Neubau oft schneller, als zu versuchen, den Status für Hunderte von Ressourcen manuell zu rekonstruieren.
Bevor Sie diesen Weg gehen, stellen Sie sicher, dass Sie Folgendes haben:
- Vollständigen Terraform-Code, der dem entspricht, was läuft
- Datensicherungen für Datenbanken und persistenten Speicher
- Ein Wartungsfenster mit Zustimmung der Stakeholder
- Einen Rollback-Plan für den Fall, dass der Neubau fehlschlägt
Praktische Checkliste für die Statuswiederherstellung
Wenn der Status kaputt geht, arbeiten Sie diese Checkliste der Reihe nach ab:
- Schaden bestätigen - Ist der Status gesperrt, gelöscht oder beschädigt? Überprüfen Sie die Fehlermeldung sorgfältig.
- Nach Backups suchen - Überprüfen Sie die Versionierung auf Ihrem Backend. Überprüfen Sie manuelle Backup-Speicherorte.
- Wenn möglich wiederherstellen - Wenn Sie ein Backup haben, stellen Sie es wieder her und verifizieren Sie es mit
terraform plan. - Force-Unlock bei Sperrung - Nur wenn Sie sicher sind, dass kein anderer Prozess aktiv ist.
- Ressourcen importieren - Wenn kein Backup existiert, beginnen Sie, Ressourcen einzeln zu importieren.
- Neubau in Betracht ziehen - Nur wenn der Import unpraktisch ist und Sie vollständige Codeabdeckung haben.
Vorbeugung ist besser als Wiederherstellung
Die beste Zeit, sich auf einen Statusausfall vorzubereiten, ist bevor er passiert. Drei Praktiken erleichtern die Wiederherstellung erheblich:
Erstens: Aktivieren Sie die Versionierung auf Ihrem Status-Backend. Ob S3, Azure Storage oder GCS, die Versionierung gibt Ihnen ein Sicherheitsnetz für versehentliches Löschen oder Beschädigung.
Zweitens: Automatisieren Sie Backups. Selbst mit Versionierung sollten Sie Kopien Ihrer Statusdatei an einem separaten Ort speichern. Ein einfacher Cron-Job oder Pipeline-Schritt, der die Statusdatei in einen anderen Bucket oder ein anderes Speicherkonto kopiert, ist in fünf Minuten eingerichtet.
Drittens: Dokumentieren Sie Ihre Infrastruktur. Wenn Sie Ressourcen importieren müssen, müssen Sie wissen, was existiert und welche IDs sie haben. Ein aktuelles Inventar der Ressourcen, entweder in einer README oder generiert aus der API Ihres Cloud-Anbieters, spart während der Wiederherstellung Stunden.
Was als Nächstes kommt
Sobald der Status wiederhergestellt ist und Sie terraform plan wieder ausführen können, ist die Arbeit noch nicht getan. Der Vorfall sollte eine Überprüfung auslösen, wie Ihr Status verwaltet wird. Gibt es Lücken in Ihrer Backup-Strategie? Sollten Sie mehr Zugriffskontrollen hinzufügen, um versehentliches Löschen zu verhindern? Brauchen Sie ein Runbook für die Statuswiederherstellung?
Bei der Statuswiederherstellung geht es nicht darum, Fehler zu vermeiden. Es geht darum, einen Plan zu haben, für den Fall, dass Fehler passieren. Teams, die sich auf Statusausfälle vorbereiten, erholen sich in Minuten. Teams, die das nicht tun, verbringen Stunden mit Panik und dann Tage damit, manuell zu rekonstruieren, was sie verloren haben.
Die Infrastruktur, die Sie gebaut haben, ist noch da. Der Status ist nur eine Karte. Wenn die Karte verloren geht, zünden Sie nicht die Stadt an. Sie zeichnen eine neue Karte.