GSP648
Übersicht
In diesem Lab nutzen Sie Cloud Functions und Cloud Scheduler, um ungenutzte Cloud-Ressourcen (nicht angehängte und verwaiste nichtflüchtige Speicher) zu identifizieren und zu bereinigen. Dazu planen Sie die Ausführung einer Cloud Functions-Funktion.
Aufgabe
- Zwei nichtflüchtige Speicher erstellen
- Virtuelle Maschine (VM) erstellen, die einen der Speicher verwendet
- Speicher von der VM trennen
- Code der Cloud Functions-Funktion prüfen
- Cloud Functions-Funktion bereitstellen
- Cloud Functions-Funktion mithilfe von Cloud Scheduler-Jobs testen
Architektur
Das folgende Diagramm zeigt die Architektur aus dem ersten Abschnitt des Labs, in dem Sie eine Cloud Functions-Funktion planen, um ungenutzte und verwaiste nichtflüchtige Speicher zu identifizieren und zu bereinigen.

Einrichtung und Anforderungen
In diesem Abschnitt konfigurieren Sie die für dieses Lab erforderliche Infrastruktur und die benötigten Identitäten.
Vor dem Klick auf „Start Lab“ (Lab starten)
Lesen Sie diese Anleitung. Labs sind zeitlich begrenzt und können nicht pausiert werden. Der Timer beginnt zu laufen, wenn Sie auf Lab starten klicken, und zeigt Ihnen, wie lange Google Cloud-Ressourcen für das Lab verfügbar sind.
In diesem praxisorientierten Lab können Sie die Lab-Aktivitäten in einer echten Cloud-Umgebung durchführen – nicht in einer Simulations- oder Demo-Umgebung. Dazu erhalten Sie neue, temporäre Anmeldedaten, mit denen Sie für die Dauer des Labs auf Google Cloud zugreifen können.
Für dieses Lab benötigen Sie Folgendes:
- Einen Standardbrowser (empfohlen wird Chrome)
Hinweis: Nutzen Sie den privaten oder Inkognitomodus (empfohlen), um dieses Lab durchzuführen. So wird verhindert, dass es zu Konflikten zwischen Ihrem persönlichen Konto und dem Teilnehmerkonto kommt und zusätzliche Gebühren für Ihr persönliches Konto erhoben werden.
- Zeit für die Durchführung des Labs – denken Sie daran, dass Sie ein begonnenes Lab nicht unterbrechen können.
Hinweis: Verwenden Sie für dieses Lab nur das Teilnehmerkonto. Wenn Sie ein anderes Google Cloud-Konto verwenden, fallen dafür möglicherweise Kosten an.
Lab starten und bei der Google Cloud Console anmelden
-
Klicken Sie auf Lab starten. Wenn Sie für das Lab bezahlen müssen, wird ein Dialogfeld geöffnet, in dem Sie Ihre Zahlungsmethode auswählen können.
Auf der linken Seite befindet sich der Bereich „Details zum Lab“ mit diesen Informationen:
- Schaltfläche „Google Cloud Console öffnen“
- Restzeit
- Temporäre Anmeldedaten für das Lab
- Ggf. weitere Informationen für dieses Lab
-
Klicken Sie auf Google Cloud Console öffnen (oder klicken Sie mit der rechten Maustaste und wählen Sie Link in Inkognitofenster öffnen aus, wenn Sie Chrome verwenden).
Im Lab werden Ressourcen aktiviert. Anschließend wird ein weiterer Tab mit der Seite „Anmelden“ geöffnet.
Tipp: Ordnen Sie die Tabs nebeneinander in separaten Fenstern an.
Hinweis: Wird das Dialogfeld Konto auswählen angezeigt, klicken Sie auf Anderes Konto verwenden.
-
Kopieren Sie bei Bedarf den folgenden Nutzernamen und fügen Sie ihn in das Dialogfeld Anmelden ein.
{{{user_0.username | "Username"}}}
Sie finden den Nutzernamen auch im Bereich „Details zum Lab“.
-
Klicken Sie auf Weiter.
-
Kopieren Sie das folgende Passwort und fügen Sie es in das Dialogfeld Willkommen ein.
{{{user_0.password | "Password"}}}
Sie finden das Passwort auch im Bereich „Details zum Lab“.
-
Klicken Sie auf Weiter.
Wichtig: Sie müssen die für das Lab bereitgestellten Anmeldedaten verwenden. Nutzen Sie nicht die Anmeldedaten Ihres Google Cloud-Kontos.
Hinweis: Wenn Sie Ihr eigenes Google Cloud-Konto für dieses Lab nutzen, können zusätzliche Kosten anfallen.
-
Klicken Sie sich durch die nachfolgenden Seiten:
- Akzeptieren Sie die Nutzungsbedingungen.
- Fügen Sie keine Wiederherstellungsoptionen oder Zwei-Faktor-Authentifizierung hinzu (da dies nur ein temporäres Konto ist).
- Melden Sie sich nicht für kostenlose Testversionen an.
Nach wenigen Augenblicken wird die Google Cloud Console in diesem Tab geöffnet.
Hinweis: Wenn Sie auf Google Cloud-Produkte und ‑Dienste zugreifen möchten, klicken Sie auf das Navigationsmenü oder geben Sie den Namen des Produkts oder Dienstes in das Feld Suchen ein.
Cloud Shell aktivieren
Cloud Shell ist eine virtuelle Maschine, auf der Entwicklertools installiert sind. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft auf Google Cloud. Mit Cloud Shell erhalten Sie Befehlszeilenzugriff auf Ihre Google Cloud-Ressourcen.
-
Klicken Sie oben in der Google Cloud Console auf Cloud Shell aktivieren
.
-
Klicken Sie sich durch die folgenden Fenster:
- Fahren Sie mit dem Informationsfenster zu Cloud Shell fort.
- Autorisieren Sie Cloud Shell, Ihre Anmeldedaten für Google Cloud API-Aufrufe zu verwenden.
Wenn eine Verbindung besteht, sind Sie bereits authentifiziert und das Projekt ist auf Project_ID, eingestellt. Die Ausgabe enthält eine Zeile, in der die Project_ID für diese Sitzung angegeben ist:
Ihr Cloud-Projekt in dieser Sitzung ist festgelegt als {{{project_0.project_id | "PROJECT_ID"}}}
gcloud ist das Befehlszeilentool für Google Cloud. Das Tool ist in Cloud Shell vorinstalliert und unterstützt die Tab-Vervollständigung.
- (Optional) Sie können den aktiven Kontonamen mit diesem Befehl auflisten:
gcloud auth list
- Klicken Sie auf Autorisieren.
Ausgabe:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
Um das aktive Konto festzulegen, führen Sie diesen Befehl aus:
$ gcloud config set account `ACCOUNT`
- (Optional) Sie können die Projekt-ID mit diesem Befehl auflisten:
gcloud config list project
Ausgabe:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
Hinweis: Die vollständige Dokumentation für gcloud finden Sie in Google Cloud in der Übersicht zur gcloud CLI.
Aufgabe 1: APIs aktivieren und Repository klonen
-
Aktivieren Sie in der Cloud Shell die Cloud Scheduler API:
gcloud services enable cloudscheduler.googleapis.com
-
Klonen Sie das Repository:
gsutil cp -r gs://spls/gsp648 . && cd gsp648
-
Richten Sie die Umgebungsvariablen ein und machen Sie den Repository-Ordner zu Ihrem $WORKDIR-Verzeichnis, in dem Sie alle Befehle dieses Labs ausführen:
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null)
WORKDIR=$(pwd)
-
Richten Sie die Projektregion für dieses Lab ein:
gcloud config set compute/region {{{project_0.default_region | "REGION"}}}
-
Erstellen Sie eine Variable für die Region:
export REGION={{{project_0.default_region | Region}}}
-
Erstellen Sie eine Variable für die Zone:
export ZONE={{{project_0.default_zone | Zone}}}
Informationen dazu finden Sie unter Regionen und Zonen.
Hinweis: Wenn Sie gcloud auf Ihrem eigenen Computer ausführen, werden die Konfigurationseinstellungen sitzungsübergreifend beibehalten. In der Cloud Shell müssen Sie sie für jede neue Sitzung oder Verbindung festlegen.
Aufgabe 2: Nichtflüchtige Speicher erstellen
-
Gehen Sie in der Cloud Shell zum Verzeichnis „unattached-pd“:
cd $WORKDIR/unattached-pd
-
Exportieren Sie die Namen der Speicher als Variablen:
export ORPHANED_DISK=orphaned-disk
export UNUSED_DISK=unused-disk
-
Erstellen Sie zwei Speicher:
gcloud compute disks create $ORPHANED_DISK --project=$PROJECT_ID --type=pd-standard --size=500GB --zone=$ZONE
gcloud compute disks create $UNUSED_DISK --project=$PROJECT_ID --type=pd-standard --size=500GB --zone=$ZONE
In diesem Lab wird die Region verwendet, Sie können sich aber auch für eine andere Region entscheiden und sich im Rest des Labs ausschließlich darauf beziehen.
-
Sehen Sie nach, ob zwei Speicher erstellt wurden:
gcloud compute disks list
Die Ausgabe sollte so aussehen:
NAME LOCATION LOCATION_SCOPE SIZE_GB TYPE STATUS
orphaned-disk {{{project_0.default_zone | Zone}}} zone 500 pd-standard READY
unused-disk {{{project_0.default_zone | Zone}}} zone 500 pd-standard READY
Abgeschlossene Aufgabe testen
Klicken Sie auf Fortschritt prüfen. Wenn Sie den nichtflüchtigen Speicher erfolgreich erstellt haben, wird ein Testergebnis angezeigt.
Nichtflüchtigen Speicher erstellen
Aufgabe 3: VM erstellen und Speicher prüfen
-
Erstellen Sie in der Cloud Shell eine Instanz:
gcloud compute instances create disk-instance \
--zone=$ZONE \
--machine-type=e2-medium \
--disk=name=$ORPHANED_DISK,device-name=$ORPHANED_DISK,mode=rw,boot=no
-
Untersuchen Sie den an die VM angehängten Speicher:
gcloud compute disks describe $ORPHANED_DISK --zone=$ZONE --format=json | jq
Die Ausgabe sieht etwa so aus:
{
"creationTimestamp": "2019-06-12T12:21:25.546-07:00",
"id": "7617542552306904666",
"kind": "compute#disk",
"labelFingerprint": "42WmSpB8rSM=",
"lastAttachTimestamp": "2019-06-12T12:24:53.989-07:00",
"name": "orphaned-disk",
"physicalBlockSizeBytes": "4096",
"selfLink": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/disks/orphaned-disk",
"sizeGb": "500",
"status": "READY",
"type": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/diskTypes/pd-standard",
"users": [
"https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/instances/disk-instance"
],
"zone": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}"
}
Im vorherigen Codebeispiel ist Folgendes wichtig:
-
users gibt die VM an, an die der Speicher angehängt ist.
-
lastAttachTimestamp gibt an, wann der Speicher zuletzt an eine VM angehängt wurde.
Abgeschlossene Aufgabe testen
Klicken Sie auf Fortschritt prüfen. Wenn Sie erfolgreich eine VM-Instanz mit nichtflüchtigem Speicher erstellt haben, wird ein Testergebnis angezeigt.
VM-Instanz mit nichtflüchtigem Speicher erstellen
-
Trennen Sie den verwaisten Speicher von der VM:
gcloud compute instances detach-disk disk-instance --device-name=$ORPHANED_DISK --zone=$ZONE
-
Untersuchen Sie den verwaisten Speicher:
gcloud compute disks describe $ORPHANED_DISK --zone=$ZONE --format=json | jq
Die Ausgabe sieht etwa so aus:
{
"creationTimestamp": "2019-06-12T12:21:25.546-07:00",
"id": "7617542552306904666",
"kind": "compute#disk",
"labelFingerprint": "42WmSpB8rSM=",
"lastAttachTimestamp": "2019-06-12T12:24:53.989-07:00",
"lastDetachTimestamp": "2019-06-12T12:34:56.040-07:00",
"name": "orphaned-disk",
"physicalBlockSizeBytes": "4096",
"selfLink": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/disks/orphaned-disk",
"sizeGb": "500",
"status": "READY",
"type": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/diskTypes/pd-standard",
"zone": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}"
}
Im vorherigen Codebeispiel ist Folgendes wichtig:
- Für den Speicher wird unter
users nichts aufgelistet, da er aktuell nicht verwendet wird.
- Es gibt jetzt einen
lastDetachTimestamp-Eintrag, der angibt, wann der Speicher zuletzt von einer VM getrennt wurde und dementsprechend auch zuletzt verwendet wurde.
- Das Feld
lastAttachTimestamp ist noch vorhanden.
Abgeschlossene Aufgabe testen
Klicken Sie auf Fortschritt prüfen. Wenn Sie den verwaisten Speicher erfolgreich von der VM getrennt haben, wird ein Testergebnis angezeigt.
Verwaisten Speicher von der VM trennen
Aufgabe 4: Code der Cloud Functions-Funktion prüfen
-
Geben Sie in der Cloud Shell den Teil des Codes aus, der alle nichtflüchtigen Speicher im Projekt abruft:
cat $WORKDIR/unattached-pd/main.py | grep "(request)" -A 12
Die Ausgabe sieht so aus:
def delete_unattached_pds(request):
# get list of disks and iterate through it:
disksRequest = compute.disks().aggregatedList(project=project)
while disksRequest is not None:
diskResponse = disksRequest.execute()
for name, disks_scoped_list in diskResponse['items'].items():
if disks_scoped_list.get('warning') is None:
# got disks
for disk in disks_scoped_list['disks']: # iterate through disks
diskName = disk['name']
diskZone = str((disk['zone'])).rsplit('/',1)[1]
print (diskName)
print (diskZone)
Die Funktion ruft mit der Methode aggregatedList alle nichtflüchtigen Speicher im Google Cloud-Projekt ab, in dem sie ausgeführt wird, und iteriert anschließend über jeden einzelnen.
-
Geben Sie den Abschnitt des Codes aus, der das Feld lastAttachTimestamp prüft und den Speicher löscht, falls kein Zeitstempel vorhanden ist:
cat $WORKDIR/unattached-pd/main.py | grep "handle never" -A 11
Die Ausgabe sieht so aus:
# handle never attached disk - delete it
# lastAttachedTimestamp is not present
try:
if disk["lastAttachTimestamp"] is None:
print ("none!")
except KeyError:
print ("disk " + diskName + " was never attached - deleting")
deleteRequest = compute.disks().delete(project=project,
zone=diskZone, disk=diskName)
deleteResponse = deleteRequest.execute()
waitForZoneOperation(deleteResponse, project, diskZone)
print ("disk " + diskName + " was deleted")
continue
Mit diesem Codeabschnitt wird der Speicher gelöscht, wenn lastAttachTimestamp nicht vorhanden ist, da der Speicher in diesem Fall noch nie verwendet wurde.
-
Geben Sie den Codeabschnitt aus, der das Alter eines verwaisten Speichers berechnet und dann einen Snapshot von ihm erstellt und ihn löscht:
cat $WORKDIR/unattached-pd/main.py | grep "handle detached" -A 32
Die Ausgabe sieht so aus:
# handle detached disk - snapshot and delete
# lastAttachTimestamp is present AND users is not present
try:
if disk['users'] is None and disk['lastDetachTimestamp'] is not None:
print ("users is none")
except KeyError:
print ("disk " + diskName + " has no users and has been detached")
detachTimestamp = dateutil.parser.parse(disk['lastDetachTimestamp'])
detachedFor = pytz.utc.localize(datetime.utcnow()) - detachTimestamp
print ("disk has been detached for " + str(detachedFor))
# update this for your preferred age
if detachedFor.days > -1:
# take a snapshot
snapShotName = diskName + str(int(time.time()))
print ("taking snapshot: " + snapShotName)
snapshotBody = {
"name": snapShotName
}
snapshotRequest = compute.disks().createSnapshot(project=project,
zone=diskZone, disk=diskName, body=snapshotBody)
snapshotResponse = snapshotRequest.execute()
waitForZoneOperation(snapshotResponse, project, diskZone)
print ("snapshot completed")
# delete the disk
print ("deleting disk " + diskName)
deleteRequest = compute.disks().delete(project=project, zone=diskZone, disk=diskName)
deleteResponse = deleteRequest.execute()
waitForZoneOperation(deleteResponse, project, diskZone)
print ("disk " + diskName + " was deleted")
continue
Dieser Codeabschnitt wird verwendet, wenn für den Speicher unter „users“ nichts aufgeführt wird und ein lastDetachTimestamp vorhanden ist. Das bedeutet, dass er derzeit nicht verwendet wird, früher aber schon. In diesem Fall erstellt die Cloud Functions-Funktion einen Snapshot des Speichers, um die Daten zu sichern, und löscht dann den Speicher.
-
Klicken Sie in der Cloud Shell auf Editor öffnen, um den Cloud Shell-Editor zu öffnen und die Datei main.py zu bearbeiten.
Hinweis:
Falls Sie dazu aufgefordert werden, klicken Sie auf In neuem Fenster öffnen.
-
Gehen Sie zu gsp648/unattached-pd.
-
Öffnen Sie main.py.
-
Ersetzen Sie in Zeile 15 der Datei automating-cost-optimization durch Ihre Projekt-ID, wie in folgendem Beispiel:
project = '{{{ project_0.project_id | PROJECT ID}}}'
-
Klicken Sie auf Datei > Speichern.
Aufgabe 5: Cloud Functions-Funktion bereitstellen
-
Deaktivieren Sie die Cloud Functions API:
gcloud services disable cloudfunctions.googleapis.com
-
Aktivieren Sie die Cloud Functions API wieder:
gcloud services enable cloudfunctions.googleapis.com
-
Fügen Sie die Berechtigung artifactregistry.reader für Ihr appspot-Dienstkonto hinzu:
gcloud projects add-iam-policy-binding {{{ project_0.project_id | PROJECT ID}}} \
--member="serviceAccount:{{{ project_0.project_id | PROJECT ID}}}@appspot.gserviceaccount.com" \
--role="roles/artifactregistry.reader"
-
Stellen Sie in der Cloud Shell die Cloud Functions-Funktion bereit:
cd ~/gsp648/unattached-pd
gcloud functions deploy delete_unattached_pds --gen2 --trigger-http --runtime=python310 --region {{{project_0.default_region | Region}}}
Hinweis:
Geben Sie y ein, wenn Sie folgende Frage sehen: Allow unauthenticated invocations of new function [delete_unattached_pds]? (y/N)?
Hinweis:
Das Bereitstellen der Cloud Functions-Funktion kann je nach Region 2 bis 5 Minuten dauern.
-
Legen Sie die Trigger-URL der Cloud Functions-Funktion als Umgebungsvariable fest:
export FUNCTION_URL=$(gcloud functions describe delete_unattached_pds --format=json --region {{{project_0.default_region | Region}}} | jq -r '.url')
Abgeschlossene Aufgabe testen
Klicken Sie auf Fortschritt prüfen. Wenn Sie die Cloud Functions-Funktion erfolgreich bereitgestellt haben, wird ein Testergebnis angezeigt.
Cloud Functions-Funktion bereitstellen
Aufgabe 6: Cloud Functions-Funktion planen und testen
- Erstellen Sie in der Cloud Shell eine App Engine-Anwendung, um Cloud Scheduler zu verwenden:
gcloud app create --region={{{project_0.startup_script.app_region | REGION}}}
-
Erstellen Sie in der Cloud Shell eine Cloud Scheduler-Task, um die Cloud Functions-Funktion täglich um 2:00 Uhr auszuführen:
gcloud scheduler jobs create http unattached-pd-job \
--schedule="* 2 * * *" \
--uri=$FUNCTION_URL \
--location=$REGION
Abgeschlossene Aufgabe testen
Klicken Sie auf Fortschritt prüfen. Wenn Sie erfolgreich eine Cloud Scheduler-Task zum Ausführen der Cloud Functions-Funktion erstellt haben, wird ein Testergebnis angezeigt.
Cloud Scheduler-Task zum Ausführen der Cloud Functions-Funktion erstellen
-
Testen Sie den Job, indem Sie ihn manuell auslösen:
gcloud scheduler jobs run unattached-pd-job \
--location=$REGION
-
Sehen Sie nach, ob ein Snapshot des verwaisten Speichers erstellt wurde:
gcloud compute snapshots list
Die Ausgabe sieht etwa so aus:
NAME DISK_SIZE_GB SRC_DISK STATUS
orphaned-disk1560455894 500 {{{project_0.default_zone | Zone}}}/disks/orphaned-disk READY
-
Sehen Sie nach, ob der ungenutzte und der verwaiste Speicher gelöscht wurden:
gcloud compute disks list
Die Ausgabe sieht etwa so aus:
NAME LOCATION LOCATION_SCOPE SIZE_GB TYPE STATUS
disk-instance {{{project_0.default_zone | Zone}}} zone 10 pd-standard READY
Abgeschlossene Aufgabe testen
Klicken Sie auf Fortschritt prüfen. Wenn Sie den Job erfolgreich getestet haben, indem Sie ihn manuell ausgelöst haben, wird ein Testergebnis angezeigt.
Job durch manuelles Auslösen testen
Das wars! Sie haben das Lab erfolgreich abgeschlossen.
In diesem Lab haben Sie folgende Aufgaben erledigt:
- Zwei nichtflüchtige Speicher erstellt
- Eine VM erstellt, die einen der Speicher verwendet
- Den Speicher von der VM getrennt
- Den Code der Cloud Functions-Funktion untersucht
- Die Cloud Functions-Funktion bereitgestellt
- Die Cloud Functions-Funktion mithilfe von Cloud Scheduler-Jobs getestet
Google Cloud-Schulungen und -Zertifizierungen
In unseren Schulungen erfahren Sie alles zum optimalen Einsatz unserer Google Cloud-Technologien und können sich entsprechend zertifizieren lassen. Unsere Kurse vermitteln technische Fähigkeiten und Best Practices, damit Sie möglichst schnell mit Google Cloud loslegen und Ihr Wissen fortlaufend erweitern können. Wir bieten On-Demand-, Präsenz- und virtuelle Schulungen für Anfänger wie Fortgeschrittene an, die Sie individuell in Ihrem eigenen Zeitplan absolvieren können. Mit unseren Zertifizierungen weisen Sie nach, dass Sie Experte im Bereich Google Cloud-Technologien sind.
Anleitung zuletzt aktualisiert am 14. November 2025
Lab zuletzt getestet am 14. November 2025
© 2026 Google LLC. Alle Rechte vorbehalten. Google und das Google-Logo sind Marken von Google LLC. Alle anderen Unternehmens- und Produktnamen können Marken der jeweils mit ihnen verbundenen Unternehmen sein.