Vermeiden Sie unbemerkt anfallende Cloud-Kosten, indem Sie Ihre Instanzen direkt beim Start mit Labels versehen.

"John Doe"-Instanzen aufspüren
Wenn Sie sich Ihre Nutzung von Google Cloud Compute Engine ansehen, stoßen Sie womöglich auf Instanzen oder Disks ohne Namen – oder schlimmer noch, mit einem nichtssagenden Namen. Solche Ressourcen sind entweder reine Geldverschwendung oder wesentlicher Bestandteil produktiver Workloads.
Manche Instanzen sind mehrere Jahre alt, und niemand im Unternehmen weiß noch, wofür sie gedacht sind oder hat die Zugangsdaten dafür.
Um genau das zu verhindern, setzen Unternehmen Label-Richtlinien durch: Jede neu bereitgestellte Instanz muss ein Name-/Owner-/Project-/usw.-Label tragen.
Für Labels in Google Cloud Compute Engine fallen keine zusätzlichen Kosten an.
… da Instanzen jedoch von Menschen gestartet oder per Automatisierungsskript erzeugt werden, ist dieser Prozess fehleranfällig.
Um das zu vermeiden, habe ich eine Auto-Labeling-Lösung für Google Cloud entwickelt (eine vergleichbare Lösung für AWS finden Sie hier), die Instanzen automatisch mit dem Label created-by und Disks mit den Labels created-by und instance versieht.
Stößt also künftig jemand auf eine Instanz oder Disk mit unklarem Zweck, lässt sich anhand dieser Labels schnell nachvollziehen, wer sie aufgesetzt hat.
Für Google-Cloud-Labels ist nur ein bestimmter Zeichensatz erlaubt. Daher ersetzt das Skript in der User-E-Mail-Adresse das At-Zeichen (@) durch einen Unterstrich ( _) und den Punkt ( .) durch einen Bindestrich ( -).
Wie funktioniert Auto-Labeling?

Überblick über den Labeling-Prozess
Ein Nutzer oder ein Service Account erstellt eine neue Compute-Engine-Maschine.
- Der API-Aufruf wird in StackDriver protokolliert. Über einen StackDriver Sink (auch bekannt als Operations Logging) gelangt das Event zu Cloud Pub/Sub.
- Cloud Pub/Sub ruft eine Cloud Function mit den Event-Informationen auf.
- Cloud Functions versieht die Instanz und die zugehörigen Disks mit Labels.
So richten Sie Auto-Labeling für Instanzen & Disks ein
Wenn Sie zum ersten Mal eine Function deployen, prüfen Sie, ob die Cloud Build API aktiviert ist.
1. Einen dedizierten Service Account mit minimalen Rechten anlegen
Dieser Schritt ist optional, aber dringend zu empfehlen!
Wenn Sie eine neue Cloud Function erstellen, nutzt sie standardmäßig den App-Engine-Service-Account mit projektweiten Editor-Rechten.
Mit der Editor-Rolle kann die Function Ressourcen im gesamten Projekt verändern. Aus Sicherheitsgründen sollten Sie ihr daher so wenige Rechte wie möglich einräumen. Im Fehlerfall bleibt der Schaden so überschaubar – die Function darf dann ausschließlich Instanz- und Disk-Informationen auslesen sowie Labels für Instanzen und Disks setzen:
# GCP IAM Permissions required for the function:
compute.disks.get
compute.disks.setLabels
compute.instances.get
compute.instances.setLabels
Einen Service Account mit Custom Role anzulegen, ist etwas aufwendig und erfordert mehrere Schritte über verschiedene Bildschirme. Der Einfachheit halber hier die passenden gcloud-Befehle:
# Replace <project-id> with your project id. gcloud iam roles create autolabel_instances --title=autolabel-instances --project <project-id> --description='cloud function service account to label instanes and disks upon creation' --permissions=compute.disks.get,compute.disks.setLabels,compute.instances.get,compute.instances.setLabels --stage=GAgcloud iam service-accounts create autolabel-instancesgcloud projects add-iam-policy-binding <project-id> --member serviceAccount:autolabel-instances@<project-id>.iam.gserviceaccount.com --role projects/<project-id>/roles/autolabel_instancesgcloud projects add-iam-policy-binding <project-id> --member serviceAccount:autolabel-instances@<project-id>.iam.gserviceaccount.com --role roles/logging.logWriter
Die E-Mail-Adresse des neuen Service Accounts lautet autolabel-instances@
2. Öffnen Sie die Seite Cloud Functions und klicken Sie auf CREATE FUNCTION.

a) Geben Sie der Function einen Namen und stellen Sie den Trigger auf Cloud Pub/Sub um. Klicken Sie im Feld darunter auf CREATE A TOPIC und vergeben Sie einen Namen für das neue Topic.

b) Falls Sie das Anlegen des Service Accounts übersprungen haben, klicken Sie auf SAVE und Next. Andernfalls klicken Sie auf VARIABLES, NETWORKING AND ADVANCED SETTINGS, wählen den zuvor angelegten Service Account aus und klicken anschließend auf SAVE und NEXT.
c) Stellen Sie die Function-Runtime auf Python 3.7 um.

Klicken Sie anschließend auf Source code und wählen Sie ZIP Upload. Die ZIP-Datei können Sie aus unserem GitHub-Repository herunterladen (es enthält auch den Quellcode der Function). Klicken Sie dann auf DEPLOY.
3. Wechseln Sie zu StackDriver Logging
Klicken Sie im Suchfeld rechts auf den Pfeil, wechseln Sie in den Advanced Filter und fügen Sie Folgendes ein:
resource.type="gce_instance"
jsonPayload.event_subtype="compute.instances.insert"
jsonPayload.event_type="GCE_API_CALL"
Klicken Sie dann auf CREATE SINK. Vergeben Sie einen Namen für den Sink, stellen Sie den Sink Service auf Pub/Sub um und legen Sie als Sink Destination das im vorherigen Schritt erstellte Pub/Sub-Topic fest. Klicken Sie zum Abschluss auf Create Sink.

4. Starten Sie eine Instanz, um die Function zu testen.
Öffnen Sie die Seite VM instances – die neue Instanz sollte automatisch gelabelt sein.

Seite "VM instances"
Öffnen Sie anschließend die Seite Disks – auch die Disks der Instanz sollten automatisch gelabelt sein.

Seite "Disks"
Hinweise:
Diese Lösung labelt ausschließlich Instanzen, die nach der Installation der Cloud Function neu erstellt werden.
Wir haben Iris als Open Source veröffentlicht – eine vollständige Lösung von DoiT International, mit der sich Google-Cloud-Ressourcen automatisch labeln lassen.