1. Übersicht
In diesem Codelab erstellen Sie einen neuen Cloud Run-Dienst, den Image Garbage Collector, der von Eventarc ausgelöst wird. Eventarc ist ein neuer Dienst zum Empfangen von Ereignissen in Cloud Run. Wenn ein Bild aus dem Bilder-Bucket gelöscht wird, empfängt der Dienst ein Ereignis von Eventarc. Anschließend wird das Bild aus dem Bucket mit den Thumbnails gelöscht und auch aus der Firestore-Sammlung „pictures“ entfernt.

Lerninhalte
- Cloud Run
- Cloud Storage
- Cloud Firestore
- Eventarc
2. Einrichtung und Anforderungen
Umgebung zum selbstbestimmten Lernen einrichten
- Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.



- Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es handelt sich um einen String, der nicht von Google APIs verwendet wird und den Sie jederzeit aktualisieren können.
- Die Projekt-ID muss für alle Google Cloud-Projekte eindeutig sein und ist unveränderlich (kann nach der Festlegung nicht mehr geändert werden). In der Cloud Console wird automatisch ein eindeutiger String generiert. Normalerweise ist es nicht wichtig, wie dieser aussieht. In den meisten Codelabs müssen Sie auf die Projekt-ID verweisen (die in der Regel als
PROJECT_IDangegeben wird). Wenn Ihnen die ID nicht gefällt, können Sie eine andere zufällige ID generieren oder eine eigene ID ausprobieren und sehen, ob sie verfügbar ist. Nachdem das Projekt erstellt wurde, wird es „eingefroren“. - Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten
- Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs verwenden zu können. Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Wenn Sie Ressourcen herunterfahren möchten, damit nach Abschluss dieses Codelabs keine Gebühren anfallen, folgen Sie den Bereinigungsanweisungen am Ende des Codelabs. Neue Nutzer von Google Cloud kommen für das Programm für kostenlose Testversionen mit einem Guthaben von 300$ infrage.
Cloud Shell starten
Während Sie Google Cloud von Ihrem Laptop aus per Fernzugriff nutzen können, wird in diesem Codelab Google Cloud Shell verwendet, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.
Klicken Sie in der GCP Console oben rechts in der Symbolleiste auf das Cloud Shell-Symbol:

Die Bereitstellung und Verbindung mit der Umgebung sollte nur wenige Augenblicke dauern. Anschließend sehen Sie in etwa Folgendes:

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Für dieses Lab benötigen Sie lediglich einen Browser.
3. Einführung in Eventarc
Mit Eventarc können Sie Cloud Run-Dienste ganz einfach mit Ereignissen aus verschiedenen Quellen verbinden. Eventarc übernimmt die Aufnahme, Bereitstellung, Sicherheit, Autorisierung und Fehlerbehandlung von Daten für Sie.

Sie können Ereignisse aus Google Cloud-Quellen und benutzerdefinierten Anwendungen, die in Cloud Pub/Sub veröffentlicht werden, abrufen und an Google Cloud Run-Senken senden.
Ereignisse aus einer Vielzahl von Google Cloud-Quellen werden über Cloud-Audit-Logs bereitgestellt. Die Latenz und Verfügbarkeit der Ereignisübermittlung aus diesen Quellen sind an die von Cloud-Audit-Logs gebunden. Immer wenn ein Ereignis aus einer Google Cloud-Quelle ausgelöst wird, wird ein entsprechender Cloud-Audit-Logeintrag erstellt.
Benutzerdefinierte Anwendungen, die in Cloud Pub/Sub veröffentlichen, können Nachrichten in einem von ihnen angegebenen Pub/Sub-Thema in einem beliebigen Format veröffentlichen.
Ereignistrigger sind der Filtermechanismus, mit dem angegeben wird, welche Ereignisse an welche Senke gesendet werden.
Alle Ereignisse werden im CloudEvents-Format v1.0 für die dienstübergreifende Interoperabilität bereitgestellt.
4. Hinweis
APIs aktivieren
Sie benötigen den Eventarc-Dienst, um den Cloud Run-Dienst auszulösen. Prüfen Sie, ob die Funktion aktiviert ist:
gcloud services enable eventarc.googleapis.com
Der Vorgang sollte erfolgreich abgeschlossen werden:
Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.
Dienstkonten konfigurieren
Das Compute-Standarddienstkonto wird in Triggern verwendet. Weisen Sie dem Standarddienstkonto für Compute die Rolle eventarc.eventReceiver zu:
PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)')
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
--role roles/eventarc.eventReceiver
Weisen Sie dem Cloud Storage-Dienstkonto die Rolle pubsub.publisher zu. Das ist für den Eventarc Cloud Storage-Trigger erforderlich:
SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)
gcloud projects add-iam-policy-binding $PROJECT_NUMBER \
--member serviceAccount:$SERVICE_ACCOUNT \
--role roles/pubsub.publisher
Wenn Sie das Pub/Sub-Dienstkonto am oder vor dem 8. April 2021 aktiviert haben, weisen Sie dem Pub/Sub-Dienstkonto die Rolle iam.serviceAccountTokenCreator zu:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role roles/iam.serviceAccountTokenCreator
5. Code klonen
Klonen Sie den Code, falls Sie das im vorherigen Codelab noch nicht getan haben:
git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
Sie können dann zum Verzeichnis mit dem Dienst wechseln:
cd serverless-photosharing-workshop/services/garbage-collector/nodejs
Der Dienst hat das folgende Dateilayout:
services
|
├── garbage-collector
|
├── nodejs
|
├── index.js
├── package.json
Im Ordner befinden sich drei Dateien:
index.jsenthält den Node.js-Code.package.jsondefiniert die Bibliotheksabhängigkeiten.
6. Code ansehen
Abhängigkeiten
In der Datei package.json werden die erforderlichen Bibliotheksabhängigkeiten definiert:
{
"name": "garbage_collector_service",
"version": "0.0.1",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"cloudevents": "^4.0.1",
"express": "^4.17.1",
"@google/events": "^3.1.0",
"@google-cloud/firestore": "^4.9.9",
"@google-cloud/storage": "^5.8.3"
}
}
Wir verwenden die Cloud Storage-Bibliothek, um Bilder in Cloud Storage zu löschen. Wir deklarieren eine Abhängigkeit von Cloud Firestore, um auch zuvor gespeicherte Bildmetadaten zu löschen. Außerdem sind wir auf CloudEvents SDK- und Google Events-Bibliotheken angewiesen, um die von Eventarc gesendeten CloudEvents zu lesen. Express ist ein JavaScript-/Node-Web-Framework. Bluebird wird für die Verarbeitung von Promises verwendet.
index.js
Sehen wir uns den index.js-Code genauer an:
const express = require('express');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');
const { HTTP } = require("cloudevents");
const {toStorageObjectData} = require('@google/events/cloud/storage/v1/StorageObjectData');
Wir benötigen die verschiedenen Abhängigkeiten, die für die Ausführung unseres Programms erforderlich sind: Express ist das Node-Webframework, das wir verwenden werden, Bluebird ist eine Bibliothek für die Verarbeitung von JavaScript-Promises, Storage und Firestore sind für die Arbeit mit Google Cloud Storage (unseren Bild-Buckets) bzw. dem Cloud Firestore-Datenspeicher. Außerdem benötigen wir CloudEvent, um das von Eventarc StoreObjectData gesendete CloudEvent aus der Google Events-Bibliothek zu lesen, um den Cloud Storage-Ereignis-Body des CloudEvents zu lesen.
const app = express();
app.use(express.json());
app.post('/', async (req, res) => {
try {
const cloudEvent = HTTP.toEvent({ headers: req.headers, body: req.body });
console.log(cloudEvent);
/* ... */
} catch (err) {
console.log(`Error: ${err}`);
res.status(500).send(err);
}
});
Oben sehen Sie die Struktur unseres Node-Handlers: Unsere App reagiert auf HTTP-POST-Anfragen. Sie liest das CloudEvent aus der HTTP-Anfrage und wir führen eine Fehlerbehandlung durch, falls etwas schiefgeht. Sehen wir uns nun an, was sich in dieser Struktur befindet.
Im nächsten Schritt wird der CloudEvent-Body abgerufen und geparst und der Objektname abgerufen:
const storageObjectData = toStorageObjectData(cloudEvent.data);
console.log(storageObjectData);
const objectName = storageObjectData.name;
Sobald wir den Bildnamen kennen, können wir das Bild aus dem Thumbnail-Bucket löschen:
try {
await storage.bucket(bucketThumbnails).file(objectName).delete();
console.log(`Deleted '${objectName}' from bucket '${bucketThumbnails}'.`);
}
catch(err) {
console.log(`Failed to delete '${objectName}' from bucket '${bucketThumbnails}': ${err}.`);
}
Löschen Sie im letzten Schritt auch die Bildmetadaten aus der Firestore-Sammlung:
try {
const pictureStore = new Firestore().collection('pictures');
const docRef = pictureStore.doc(objectName);
await docRef.delete();
console.log(`Deleted '${objectName}' from Firestore collection 'pictures'`);
}
catch(err) {
console.log(`Failed to delete '${objectName}' from Firestore: ${err}.`);
}
res.status(200).send(`Processed '${objectName}'.`);
Jetzt ist es an der Zeit, dass unser Node-Skript auf eingehende Anfragen reagiert. Prüfen Sie außerdem, ob die erforderlichen Umgebungsvariablen festgelegt sind:
app.listen(PORT, () => {
if (!bucketThumbnails) throw new Error("BUCKET_THUMBNAILS not set");
console.log(`Started service on port ${PORT}`);
});
7. Lokal testen
Testen Sie den Code lokal, um sicherzustellen, dass er funktioniert, bevor Sie ihn in der Cloud bereitstellen.
Installieren Sie im Ordner garbage-collector/nodejs die npm-Abhängigkeiten und starten Sie den Server:
export BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT npm install; npm start
Wenn alles geklappt hat, sollte der Server auf Port 8080 gestartet werden:
Started service on port 8080
Verwenden Sie zum Beenden CTRL-C.
8. In Cloud Run erstellen und bereitstellen
Legen Sie vor der Bereitstellung in Cloud Run die Cloud Run-Region auf eine der unterstützten Regionen und die Plattform auf managed fest:
REGION=europe-west1 gcloud config set run/region $REGION gcloud config set run/platform managed
So prüfen Sie, ob die Konfiguration festgelegt ist:
gcloud config list ... [run] platform = managed region = europe-west1
Anstatt das Container-Image manuell mit Cloud Build zu erstellen und zu veröffentlichen, können Sie es auch von Cloud Run mit Google Cloud Buildpacks erstellen lassen.
Führen Sie den folgenden Befehl aus, um das Container-Image mit Google Cloud Buildpacks zu erstellen und es dann in Cloud Run bereitzustellen:
SERVICE_NAME=garbage-collector-service
gcloud run deploy $SERVICE_NAME \
--source . \
--no-allow-unauthenticated \
--update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS
Beachten Sie das Flag –-source. Dadurch wird Cloud Run angewiesen, Google Cloud-Buildpacks zum Erstellen des Container-Images ohne Dockerfile. zu verwenden. Das Flag --no-allow-unauthenticated macht den Cloud Run-Dienst zu einem internen Dienst, der nur von bestimmten Dienstkonten ausgelöst wird. Später erstellen Sie einen Trigger mit dem Standarddienstkonto für Compute, das die Rolle run.invoker hat, um interne Cloud Run-Dienste aufzurufen.
9. Trigger erstellen
In Eventarc wird mit einem Trigger festgelegt, welcher Dienst welche Art von Ereignissen erhalten soll. In diesem Fall soll der Dienst Ereignisse empfangen, wenn eine Datei in einem Bucket gelöscht wird.
Legen Sie den Standort des Triggers in derselben Region wie den Bucket mit den hochgeladenen Bildern fest:
gcloud config set eventarc/location eu
Erstellen Sie einen AuditLog-Trigger, um nach storage.objects.delete-Ereignissen zu filtern und diese an den Cloud Run-Dienst zu senden:
BUCKET_IMAGES=uploaded-pictures-$GOOGLE_CLOUD_PROJECT gcloud eventarc triggers create trigger-$SERVICE_NAME \ --destination-run-service=$SERVICE_NAME \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.storage.object.v1.deleted" \ --event-filters="bucket=$BUCKET_IMAGES" \ --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
Mit diesem Befehl können Sie prüfen, ob der Trigger erstellt wurde:
gcloud eventarc triggers list
10. Dienst testen
Um zu testen, ob der Dienst funktioniert, rufen Sie den Bucket uploaded-pictures auf und löschen Sie eines der Bilder. In den Logs des Dienstes sollte zu sehen sein, dass das entsprechende Bild im Bucket thumbnails und das zugehörige Dokument in der Firestore-Sammlung pictures gelöscht wurden.

11. Bereinigen (optional)
Wenn Sie nicht mit den anderen Labs der Reihe fortfahren möchten, können Sie Ressourcen bereinigen, um Kosten zu sparen und nicht mehr benötigte Ressourcen für andere freizugeben. Sie können Ressourcen einzeln so bereinigen:
Löschen Sie den Dienst:
gcloud run services delete $SERVICE_NAME -q
Löschen Sie den Eventarc-Trigger:
gcloud eventarc triggers delete trigger-$SERVICE_NAME -q
Alternativ können Sie das gesamte Projekt löschen:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
12. Glückwunsch!
Glückwunsch! Sie haben einen Cloud Run-Dienst namens „image garbage collector“ erstellt, der von Eventarc ausgelöst wird. Eventarc ist ein neuer Dienst zum Empfangen von Ereignissen in Cloud Run. Wenn ein Bild aus dem Bilder-Bucket gelöscht wird, empfängt der Dienst ein Ereignis von Eventarc. Anschließend wird das Bild aus dem Bucket mit den Thumbnails gelöscht und auch aus der Firestore-Sammlung „pictures“ entfernt.
Behandelte Themen
- Cloud Run
- Cloud Storage
- Cloud Firestore
- Eventarc