Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Safe Scrub: Schluss mit Chaos in Ihren Google-Cloud-Projekten

By Joshua FoxJul 16, 20206 min read

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

Wer auf Google Cloud neue Infrastruktur entwirft und entwickelt, probiert allerhand Ressourcen aus. Zurück bleibt ein unaufgeräumtes Projekt – und solange diese Ressourcen weiterlaufen, kosten sie Geld.

Sie können Ressourcen von Hand löschen, doch quer durch die vielen GCP-Dienste – Compute, Containers, AppEngine, Cloud SQL und mehr – wirklich alles zu finden, ist mühsam.

Genau dafür habe ich das Open-Source-Tool Safe Scrub entwickelt: einfach – und vor allem sicher!

Sicherheit zuerst

Safe Scrub ist von Grund auf auf Sicherheit ausgelegt.

Safe Scrub löscht keine Ressourcen – es erzeugt lediglich ein Skript, das Ressourcen löschen kann.

Transparentes Löschskript

Dieses Löschskript ist transparent: Da es schlicht aus einer Liste von gcloud``delete-Anweisungen besteht, sehen Sie auf einen Blick, was mit Ihren Ressourcen passieren würde. Nachdem Sie das Skript erzeugt haben, prüfen Sie jede Zeile, sehen genau, was gelöscht würde – und führen es erst dann aus.

Das ist die wichtigste Sicherheitsmaßnahme, aber bei Weitem nicht die einzige.

Explizites Konto und Projekt

Safe Scrub verlangt eine JSON-Schlüsseldatei mit den Zugangsdaten eines Service-Accounts – nicht die Ihres eingeloggten Benutzerkontos. So erzwingt das Tool die bewusste Wahl einer Rolle. Der Service-Account sollte eine Rolle ohne Schreibrechte haben, etwa Project Viewer, denn das Skript zur Skript-Generierung braucht keine Schreibrechte.

Sie können sogar eine noch enger gefasste Rolle vergeben, wenn Sie nur bestimmte Ressourcentypen auflisten möchten. Fehlende Berechtigungen sind kein Problem: Ist die Rolle zu restriktiv (oder eine GCP-API noch nicht aktiviert), läuft Safe Scrub einfach weiter – die betreffende Ressource lässt sich dann eben nicht auflisten. Das Tool gibt eine Fehlermeldung aus und macht weiter.

Anders als gcloud selbst verlangt Safe Scrub die explizite Angabe eines Projekts. So vermeiden Sie, dass versehentlich ein Standardprojekt herangezogen wird und Ressourcen in der Liste landen, die Sie gar nicht löschen wollten. Auch das erzeugte Löschskript benennt für jeden Löschbefehl das Projekt explizit – damit die Löschung nicht aus Versehen Ihr aktuelles Standardprojekt trifft.

Filterung

Safe Scrub unterstützt zwei Arten von Filtern.

Erstens gibt es eine Kommandozeilenoption, mit der Sie gezielt die gewünschten Ressourcen auswählen. Sie können nach Label, Name, Erstellungsdatum und vielem mehr filtern und nutzen dabei die volle Mächtigkeit der gcloud-Filterung. (Bei Cloud Storage Buckets, wo statt gcloud das Tool gsutil zum Einsatz kommt, werden nur einfache Label-Gleichheitsfilter mit einem Schlüssel (key=value1) unterstützt. Andernfalls wird der Filter ignoriert.)

Zweitens unterstützt Safe Scrub eine Ausschlussliste in exclusions.txt. Ressourcen, deren URI eine dieser Zeichenketten enthält, landen nicht im Löschskript. Lassen Sie dazu Safe Scrub einmal laufen, notieren Sie die Elemente, die künftig nicht gelöscht werden sollen, und tragen Sie die jeweilige URI – oder einen identifizierenden Teil davon – in exclusions.txt ein. (Bei Cloud Functions wird wegen eines Bugs in gcloud der Name statt der URI verwendet.)

Folgende Einträge zum Beispiel:

networks/default firewalls/default

sorgen dafür, dass die Standard-Netzwerke sowie die Standard-Firewalls (deren URIs die Form https://www.googleapis.com/compute/v1/projects/my-project/global/firewalls/default-allow-https haben) nicht gelöscht werden.

Den Löschvorgang im Blick behalten

Beim ersten Lauf Ihrer Löschskripte wollen Sie den Vorgang live mitverfolgen. Safe Scrub stellt dem Löschskript daher set -x voran, sodass Sie Debug-Ausgaben erhalten.

Damit Sie die Löschung gut beobachten können, erzeugt Safe Scrub standardmäßig ein gewöhnliches sequentielles Skript. Mit dem Schalter -b lassen sich stattdessen asynchrone Hintergrundbefehle generieren, sodass mehrere Ressourcen parallel gelöscht werden. Das ist schneller, aber schwerer nachzuverfolgen – und birgt das Risiko, Systeme mit zu vielen gleichzeitigen Aufrufen zu überlasten.

Nächste Schritte: Prüfen und Ausführen

Im ersten Schritt erhalten Sie nur ein Löschskript. Im nächsten Schritt prüfen Sie es und entfernen die Zeilen für alle Ressourcen, die erhalten bleiben sollen. Diese Gelegenheit können Sie auch nutzen, um Einträge in exclusions.txt für künftige Filterungen zu ergänzen.

Ressourcen tatsächlich löschen

Wenn Sie zum Löschen bereit sind, führen Sie das Löschskript unter einem Konto mit den passenden Schreibrechten aus, etwa Project Editor.

Dangerous Mode

Wir lieben Automatisierung in der Cloud – doch bei Massenlöschungen ist besondere Vorsicht angesagt, und jeder Schritt sollte manuell nachvollzogen werden. Bei einem Entwicklungs- oder QA-Projekt können Sie Ihre Safe-Scrub-Konfiguration aber so weit verfeinern, dass Sie sich wohl dabei fühlen, das Löschskript in einem Rutsch automatisch zu generieren und auszuführen. Leiten Sie dafür die Ausgabe einfach an bash weiter, wie in dangerous-usage-example.sh gezeigt. In diesem Fall sollte Ihr Service-Account Lese- und Schreibrechte haben, etwa als Project Editor.

Anwendungsfälle

Dev und QA vs. Produktion

Safe Scrub ist für Entwicklungs- und QA-Projekte gedacht, in denen Sie am Tagesende oder vor einem neuen Testlauf bei Null anfangen wollen. Für Produktionsprojekte ist es kaum geeignet – dort sollten Sie mögliche Abhängigkeiten zwischen Komponenten klären, bevor Sie irgendetwas löschen.

Blockierende Abhängigkeiten auflösen

Praktisch ist Safe Scrub auch dann, wenn eine versprengte Abhängigkeit das Löschen einer anderen Ressource blockiert. Einen Google Kubernetes Engine Cluster können Sie zum Beispiel nicht löschen, solange ein Backend darauf verweist – selbst wenn dieses Backend gar nicht von einem Load Balancer genutzt wird. Lassen Sie Safe Scrub Löschbefehle für alle Ressourcen erzeugen, suchen Sie sich genau die Befehlszeile heraus, die das Backend entfernt, und geben Sie damit den Cluster wieder frei.

Aktueller Umfang und Ausblick

Unterstützte und nicht unterstützte Dienste

Google Cloud umfasst über 90 Produkte – Safe Scrub deckt nicht alle davon ab. Ich habe mich auf die wichtigen, häufig genutzten Dienste konzentriert, die in typischer Entwicklung und QA hochgefahren und wieder abgebaut werden. Dazu zählen Ressourcentypen aus GCE, PubSub, App Engine, Cloud SQL, Cloud Storage, Functions und GKE. Nicht unterstützt werden unter anderem Composer, Data Catalog, Data Proc und einige weitere. Die vollständige Liste der unterstützten und nicht unterstützten Dienste finden Sie im Usage-Text. (Führen Sie dazu ./generate-deletion-script.sh aus.)

Unterstützte und nicht unterstützte Ressourcentypen

Nicht zwangsläufig sind alle Ressourcentypen jedes Dienstes abgedeckt, doch die wichtigsten dürften enthalten sein – Ressourcentypen, deren Löschung besonders riskant ist, habe ich bewusst ausgespart. In App Engine werden zum Beispiel Services, Versionen, Instanzen und Firewall-Regeln unterstützt, SSL-Zertifikate dagegen nicht. Wenn Sie weitere APIs oder Ressourcentypen brauchen, freuen wir uns über einen Pull Request oder ein Issue auf GitHub.

Mögliche zukünftige Implementierungen

Eine künftige Version von Safe Scrub könnte den Befehl gcloud resources list nutzen (Stand Juni 2020 in Alpha), um alle Ressourcen vollständig zu erfassen. Ob wir diesen Weg gehen, ist aber noch offen: Manche Ressourcentypen eignen sich kaum zum automatisierten Löschen (etwa IAM, Secrets und SSL-Zertifikate – hier könnten Sie versehentlich etwas Wichtiges löschen). Außerdem haben manche Ressourcentypen eigene Löschbefehle. (Für Cloud Storage verwenden wir beispielsweise gsutil statt gcloud, und für BigQuery wird bq zum Einsatz kommen.)

Erste Schritte

Hier klicken, um das Open-Source-Tool Safe Scrub herunterzuladen.

Entpacken Sie das Archiv und führen Sie ./generate-deletion-script.sh aus, um die Nutzungshinweise zu sehen; die Datei usage-example.sh zeigt ein Beispiel.

Der einfachste Schnellstart sieht so aus:

  • Laden Sie einen Schlüssel für einen Service-Account mit der Rolle Project Viewer herunter und speichern Sie ihn als project-viewer-credentials.json im Safe-Script-Verzeichnis.
  • Führen Sie dann ./generate-deletion-script.sh -p <YOUR_PROJECT_NAME> aus.