arrow_back

Ein ausfallsicheres asynchrones System mit Cloud Run und Pub/Sub erstellen

Anmelden Teilnehmen
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Ein ausfallsicheres asynchrones System mit Cloud Run und Pub/Sub erstellen

Lab 1 Stunde universal_currency_alt 5 Guthabenpunkte show_chart Mittelstufe
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP650

Logo: Google Cloud-Labs zum selbstbestimmten Lernen

Logo von Pet Theory

Übersicht

Den Labs des Kurses Serverless Cloud Run Development liegt das Szenario eines fiktiven Unternehmens zugrunde, in dem Sie den handelnden Personen bei der Umsetzung ihres Plans für eine serverlose Migration helfen.

Vor zwölf Jahren gründete Lily die Tierklinikkette „Pet Theory“. Im Laufe der Jahre sind immer mehr Kliniken dazu gekommen, sodass nun Bedarf an einer Automatisierung besteht. Die Art und Weise, wie Pet Theory die Ergebnisse der medizinischen Tests aus den Laboren verarbeitet, ist mittlerweile zu langsam und fehleranfällig. Lily will deshalb diesen Vorgang optimieren.

Derzeit verarbeitet Patrick, der IT-Administrator von Pet Theory, die Testergebnisse manuell. Wenn die Testergebnisse aus den Laboren zurückkommen, stellt er sie zusammen und schickt eine E-Mail an den Kunden, dessen Tier untersucht wurde. Anschließend schreibt er eine SMS auf seinem Smartphone und sendet die Ergebnisse in Textform an den Kunden.

Patrick arbeitet mit der Softwareberaterin Ruby am Entwurf eines Systems, das sich besser skalieren lässt. Ihr Ziel ist es, eine Lösung mit geringem fortlaufendem Wartungsbedarf zu entwickeln. Patrick und Ruby möchten dafür eine serverlose Technologie nutzen.

Lernziele

Aufgaben in diesem Lab:

  • Pub/Sub-Thema und -Abo erstellen
  • Cloud Run-Dienst erstellen, der HTTP-Anfragen empfängt und Nachrichten in Cloud Pub/Sub veröffentlicht
  • Cloud Run-Dienst erstellen, der Nachrichten von Cloud Pub/Sub empfängt
  • Pub/Sub-Abo erstellen, das einen Cloud Run-Dienst auslöst
  • Ausfallsicherheit des Systems testen

Voraussetzungen

Für dieses Lab wird davon ausgegangen, dass Sie mit der Cloud Console und mit Shell-Umgebungen vertraut sind. Dieses Lab ist Teil einer Reihe. Es kann hilfreich sein, die vorherigen Labs zu absolvieren, ist aber nicht unbedingt erforderlich:

Einrichtung und Anforderungen

Hinweis: Melden Sie sich für dieses Lab in der Google Cloud Console mit Username 1 an, da sonst Fehler auftreten.

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 die Ressourcen für das Lab verfügbar sind.

In diesem praxisorientierten Lab können Sie die Lab-Aktivitäten in einer echten Cloud-Umgebung selbst 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, 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: Wenn Sie über ein persönliches Google Cloud-Konto oder -Projekt verfügen, verwenden Sie es nicht für dieses Lab. So werden zusätzliche Kosten für Ihr Konto vermieden.

Lab starten und bei der Google Cloud Console anmelden

  1. Klicken Sie auf Lab starten. Wenn Sie für das Lab bezahlen müssen, wird ein Pop-up-Fenster 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
  2. 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.
  3. 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.

  4. Klicken Sie auf Weiter.

  5. 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.

  6. 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.
  7. 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 sich eine Liste der Google Cloud-Produkte und ‑Dienste ansehen möchten, klicken Sie oben links auf das Navigationsmenü. Symbol für Navigationsmenü

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.

  1. Klicken Sie oben in der Google Cloud Console auf Cloud Shell aktivieren Symbol für Cloud Shell-Aktivierung.

Wenn Sie verbunden sind, sind Sie bereits authentifiziert und das Projekt ist auf Ihre 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.

  1. (Optional) Sie können den aktiven Kontonamen mit diesem Befehl auflisten:
gcloud auth list
  1. 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`
  1. (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.

Region und Zone einrichten

Bestimmte Compute Engine-Ressourcen befinden sich in Regionen und Zonen. Eine Region ist ein spezifischer Ort, an dem Sie Ihre Ressourcen ausführen können. Jede Region hat eine oder mehrere Zonen.

Führen Sie die folgenden gcloud-Befehle in der Cloud Console aus, um die Standardregion und ‑zone für Ihr Lab festzulegen:

gcloud config set compute/zone "{{{project_0.default_zone|ZONE}}}" export ZONE=$(gcloud config get compute/zone) gcloud config set compute/region "{{{project_0.default_region|REGION}}}" export REGION=$(gcloud config get compute/region)

Szenario

Pet Theory möchte den Vorgang der Weitergabe von Testergebnissen an die Kunden automatisieren. Zuletzt hatte die Klinik Mühe, die steigende Anzahl an Terminen zu bewältigen. Lily bittet deshalb Ruby um Unterstützung:

Lily

Lily, Gründerin von Pet Theory

Hallo Ruby,

vielen Dank, dass du die Sache mit dem Versicherungsportal geklärt hast.

Ich denke im Moment darüber nach, wie wir die Handhabung der medizinischen Testergebnisse verbessern können. Wir benötigen eine effizientere Möglichkeit, um Ergebnisse an die Kunden zu senden.

Lily

Ruby

Ruby, Softwareberaterin

Hallo Lily,

kein Problem, ich werde sehen, was sich machen lässt. Ich habe schon ein paar Ideen, wie die Situation verbessert werden könnte.

Ruby

Aufgabe 1: Architektur

Pet Theory lässt medizinische Tests von einem externen Unternehmen ausführen. Wenn das Laborunternehmen einen medizinischen Test abgeschlossen hat, sendet es die Ergebnisse zurück an Pet Theory.

Das Laborunternehmen verwendet dazu eine HTTP(S) POST-Anfrage, mit der die medizinischen Laborergebnisse an den Web-Endpunkt von Pet Theory übertragen werden. Die folgende Abbildung stellt die grundlegende Architektur dafür dar.

Diagramm der Systemarchitektur von Pet Theory

Nachdem sich Ruby einen Eindruck von dem grundlegenden Vorgang verschafft hat, geht sie davon aus, dass sich für Pet Theory ein System mit folgenden Möglichkeiten entwickeln lässt:

  1. Die HTTP POST-Anfrage empfangen und den Eingang gegenüber dem medizinischen Labor bestätigen
  2. Eine E-Mail mit den Testergebnissen an den Kunden senden
  3. Eine SMS und eine E-Mail mit den Testergebnissen an den Kunden senden

Im Entwurf von Ruby sind die genannten Aktivitäten voneinander getrennt. Für ein solches System ist Folgendes erforderlich:

  • Ein Dienst zum Ausführen der Anfrage und Übergeben der Antwort für die medizinischen Ergebnisse
  • Ein Dienst zum Senden einer E-Mail mit den Testergebnissen an den Kunden
  • Ein Dienst zum Senden einer SMS an den Kunden
  • Pub/Sub für die Kommunikation zwischen den Diensten
  • Eine serverlose Infrastruktur für die Anwendungsarchitektur

Mithilfe einmalig genutzter Funktionen will Ruby einen Code entwickeln, der sich einfacher schreiben lässt und weniger fehleranfällig ist.

Ruby

Ruby, Softwareberaterin

Hallo Patrick,

Lily möchte gerne, dass ich einen Prototyp erstelle, mit dem sich die medizinischen Datensätze verarbeiten lassen.

Dafür müsstest du ein Pub/Sub-Thema mit dem Namen new-lab-report einrichten.

Ruby

Patrick

Patrick, IT-Administrator

Hallo Ruby,

das hört sich nach einem coolen Projekt an. Ich kann das gleich heute Vormittag für dich machen. Beides lässt sich ganz schnell in Google Cloud erledigen.

Patrick

Pub/Sub-Thema erstellen

Unterstützen Sie Patrick dabei, ein Pub/Sub-Thema namens new-lab-report zu erstellen.

Cloud Pub/Sub in Architekturdiagramm hervorgehoben

Wenn ein Dienst eine Pub/Sub-Nachricht veröffentlicht, muss sie mit einem Thema gekennzeichnet sein. Der Laborbericht wird dann über den zu erstellenden Dienst verarbeitet. Für jeden vorhandenen Bericht soll eine Nachricht angelegt und veröffentlicht werden.

Als Erstes müssen Sie ein Thema erstellen, das für diese Aufgabe verwendet werden kann.

  1. Führen Sie zum Erstellen eines Pub/Sub-Themas folgenden Befehl aus:
gcloud pubsub topics create new-lab-report

Jeder Dienst, der das Thema „new-lab-report“ abonniert hat, kann die vom Laborberichtsdienst veröffentlichten Nachrichten nutzen. Im obigen Diagramm sind zwei solche Nutzer, ein E-Mail-Dienst und ein SMS-Dienst, dargestellt.

  1. Aktivieren Sie anschließend Cloud Run, mit dem der Code in der Cloud ausgeführt wird:
gcloud services enable run.googleapis.com

Klicken Sie auf Fortschritt prüfen.

Pub/Sub-Thema erstellen

Denken Sie daran, Ruby darüber zu informieren, dass das Pub/Sub-Thema für sie erstellt wurde.

Patrick

Patrick, IT-Administrator

Hallo Ruby,

es ist alles fertig.

Könntest du mir zeigen, wie dieser Prototyp zusammengestellt wird, wenn du Zeit hast? Können wir das gemeinsam machen?

Patrick

Ruby

Ruby, Softwareberaterin

Hallo Patrick,

wunderbar. Danke auch für die schnelle Erledigung. Ich werde einen Termin vorschlagen, an dem wir mit dem Prototyp starten können.

Ruby

Aufgabe 2: Laborberichtsdienst erstellen

Unterstützen Sie Ruby beim Einrichten des neuen Laborberichtsdienstes.

Laborberichtsdienst im Architekturdiagramm hervorgehoben

Da dieser Dienst für einen Prototyp vorgesehen ist, müssen mit ihm nur zwei Aufgaben ausgeführt werden:

  1. Empfangen der HTTPS POST-Anfrage für den Laborbericht mit den Berichtsdaten
  2. Veröffentlichen einer Nachricht in Pub/Sub

Code für den Laborberichtsdienst hinzufügen

  1. Zurück in Cloud Shell klonen Sie das Repository für dieses Lab:
git clone https://github.com/rosera/pet-theory.git
  1. Wechseln Sie zum Verzeichnis lab-service:
cd pet-theory/lab05/lab-service
  1. Installieren Sie die folgenden Pakete, die für das Empfangen eingehender HTTPS-Anfragen und für das Veröffentlichen in Pub/Sub benötigt werden:
npm install express npm install body-parser npm install @google-cloud/pubsub

Durch diese Befehle wird die Datei package.json aktualisiert und enthält jetzt die Abhängigkeiten für den Dienst.

Sie bearbeiten nun die Datei package.json und legen für Cloud Run fest, wie der Code gestartet werden soll.

  1. Öffnen Sie die Datei package.json.

  2. Fügen Sie im Abschnitt „scripts“ der Datei package.json die Codezeile "start": "node index.js", in Zeile 7 ein (wie unten gezeigt) und speichern Sie die Datei:

"scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, Hinweis: Achten Sie darauf, den Code genau wie angegeben einzufügen, einschließlich des Kommas am Ende:

"start": "node index.js",

Wenn Sie dies nicht tun, treten während der Bereitstellung Fehler auf.
  1. Erstellen Sie eine neue Datei mit dem Namen index.js und fügen Sie folgenden Code hinzu:
const {PubSub} = require('@google-cloud/pubsub'); const pubsub = new PubSub(); const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { try { const labReport = req.body; await publishPubSubMessage(labReport); res.status(204).send(); } catch (ex) { console.log(ex); res.status(500).send(ex); } }) async function publishPubSubMessage(labReport) { const buffer = Buffer.from(JSON.stringify(labReport)); await pubsub.topic('new-lab-report').publish(buffer); } In diesen beiden Zeilen sind die Hauptaufgaben des Dienstes definiert:

const labReport = req.body;

await publishPubSubMessage(labReport);

Die Hauptaufgaben sind:

  • Extrahieren des Laborberichts aus der POST-Anfrage
  • Veröffentlichen einer PubSub-Nachricht mit dem aktuell übergebenen Laborbericht
  1. Erstellen Sie jetzt eine Datei mit dem Namen Dockerfile und fügen Sie folgenden Code hinzu:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

Diese Datei legt fest, wie der Cloud Run-Dienst als Paket in einem Container erstellt wird.

Laborberichtsdienst bereitstellen

  1. Erstellen Sie eine Datei mit dem Namen deploy.sh und fügen Sie folgende Befehle hinzu:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service gcloud run deploy lab-report-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --allow-unauthenticated \ --max-instances=1
  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um die Datei ausführbar zu machen:
chmod u+x deploy.sh
  1. Nun kann der Laborberichtsdienst bereitgestellt werden. Führen Sie dazu das Bereitstellungsskript aus:
./deploy.sh

Aufgrund des Timings wird beim ersten Ausführen des Befehls möglicherweise eine Fehlermeldung ausgegeben. In diesem Fall führen Sie deploy.sh einfach noch einmal aus.

Wenn die Bereitstellung abgeschlossen wurde, sehen Sie eine Nachricht wie diese:

Service [lab-report-service] revision [lab-report-service-00001] has been deployed and is serving traffic at https://lab-report-service-[hash].a.run.app

Der Laborberichtsdienst wurde bereitgestellt und verarbeitet nun die medizinischen Laborergebnisse über HTTP. Sie können nun testen, ob der neue Dienst eingerichtet ist und funktioniert.

Klicken Sie auf Fortschritt prüfen.

Laborberichtsdienst bereitstellen: Build erstellen

Klicken Sie auf Fortschritt prüfen.

Laborberichtsdienst bereitstellen: Dienst überarbeiten

Laborberichtsdienst testen

Zur Prüfung des Laborberichtsdienstes simulieren Sie nun drei HTTPS POST-Anfragen durch das Laborunternehmen, die jeweils einen Laborbericht enthalten. Für den Test ist in den erstellten Laborberichten nur eine ID enthalten.

  1. Geben Sie als Erstes die URL zum Bericht in einer Umgebungsvariablen ein, um die Arbeit damit zu vereinfachen.
export LAB_REPORT_SERVICE_URL=$(gcloud run services describe lab-report-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. Prüfen Sie, ob LAB_REPORT_SERVICE_URL erfasst wurde:
echo $LAB_REPORT_SERVICE_URL
  1. Erstellen Sie eine neue Datei mit dem Namen post-reports.sh und fügen Sie folgenden Code hinzu:
curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 12}" \ $LAB_REPORT_SERVICE_URL & curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 34}" \ $LAB_REPORT_SERVICE_URL & curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 56}" \ $LAB_REPORT_SERVICE_URL &

Dieses Skript verwendet den Befehl curl zur Übergabe dreier unterschiedlicher IDs an die Labordienst-URL. Jeder Befehl wird einzeln im Hintergrund ausgeführt.

  1. Machen Sie das Skript post-reports.sh ausführbar:
chmod u+x post-reports.sh
  1. Testen Sie nun den Endpunkt des Laborberichtsdienstes durch Übergabe von drei Laborberichten an den Dienst mit dem oben dargestellten Skript:
./post-reports.sh

Dieses Skript übergibt drei Laborberichte an Ihren Laborberichtsdienst. Prüfen Sie in den Logs die Ergebnisse.

  1. Klicken Sie in der Cloud Console auf Navigationsmenü (Symbol für Navigationsmenü) > Cloud Run.

  2. Der neu bereitgestellte Dienst lab-report-service sollte jetzt in der Liste Dienste angezeigt werden. Klicken Sie darauf.

  3. Auf der nächsten Seite finden Sie ausführliche Informationen zu Ihrem Laborberichtsdienst. Klicken Sie auf den Tab Logs.

Auf der Logseite werden die Ergebnisse der drei Testberichte dargestellt, die Sie gerade an das Skript übergeben haben. Wenn alles funktioniert hat, sollten die zurückgegebenen HTTP-Codes 204 lauten. Das weist auf eine erfolgreiche Ausführung hin, wie unten dargestellt. Wenn keine Einträge zu sehen sind, scrollen Sie mit der Scrollleiste rechts nach oben und unten. Damit wird das Log neu geladen.

In der nächsten Aufgabe erstellen Sie die SMS- und E-Mail-Dienste. Diese Dienste werden ausgelöst, wenn der Laborberichtsdienst eine Pub/Sub-Nachricht zum Thema „new-lab-report“ veröffentlicht.

Aufgabe 3: Der E-Mail-Dienst

Unterstützen Sie Ruby beim Einrichten des neuen E-Mail-Dienstes.

E-Mail-Dienst im Architekturdiagramm hervorgehoben

Code für den E-Mail-Dienst hinzufügen

  1. Wechseln Sie zum Verzeichnis des E-Mail-Dienstes:
cd ~/pet-theory/lab05/email-service
  1. Installieren Sie die folgenden Pakete, damit der Code eingehende HTTPS-Anfragen verarbeiten kann:
npm install express npm install body-parser

Mit den obigen Befehlen wird die Datei package.json aktualisiert, die die Anwendung und ihre Abhängigkeiten beschreibt. Für Cloud Run muss festgelegt werden, wie der Code ausgeführt werden soll. Fügen Sie deshalb die Anweisung start hinzu.

  1. Öffnen Sie die Datei package.json.

  2. Fügen Sie im Abschnitt „scripts“ die Zeile "start": "node index.js", hinzu (wie unten gezeigt) und speichern Sie die Datei:

"scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, Hinweis: Achten Sie darauf, den Code genau wie angegeben einzufügen, einschließlich des Kommas am Ende:

"start": "node index.js",

Wenn Sie dies nicht tun, treten während der Bereitstellung Fehler auf.
  1. Erstellen Sie eine neue Datei index.js und fügen Sie Folgendes hinzu:
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { const labReport = decodeBase64Json(req.body.message.data); try { console.log(`Email Service: Report ${labReport.id} trying...`); sendEmail(); console.log(`Email Service: Report ${labReport.id} success :-)`); res.status(204).send(); } catch (ex) { console.log(`Email Service: Report ${labReport.id} failure: ${ex}`); res.status(500).send(); } }) function decodeBase64Json(data) { return JSON.parse(Buffer.from(data, 'base64').toString()); } function sendEmail() { console.log('Sending email'); }

Dieser Code wird ausgeführt, wenn Pub/Sub eine Nachricht an den Dienst übergibt. Dabei geschieht Folgendes:

  • Die Pub/Sub-Nachricht wird decodiert und anschließend wird versucht, die Funktion sendEmail() aufzurufen.
  • Wenn dieser Vorgang erfolgreich ausgeführt wird und keine Ausnahme auftritt, wird der Statuscode 204 zurückgegeben und so Pub/Sub mitgeteilt, dass die Nachricht verarbeitet wurde.
  • Kommt es zu einer Ausnahme, gibt der Dienst den Statuscode 500 zurück. Dies zeigt Pub/Sub an, dass die Nachricht nicht verarbeitet wurde und deshalb später noch einmal an den Dienst übergeben werden muss.

Wenn die Kommunikation zwischen den Diensten eingerichtet ist und funktioniert, fügt Ruby den Code der Funktion sendEmail() hinzu, damit die E-Mail letztendlich gesendet wird.

  1. Erstellen Sie jetzt eine Datei mit dem Namen Dockerfile und fügen Sie folgenden Code hinzu:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

Diese Datei legt fest, wie der Cloud Run-Dienst als Paket in einem Container erstellt wird.

E-Mail-Dienst bereitstellen

  1. Erstellen Sie eine neue Datei mit dem Namen deploy.sh und fügen Sie Folgendes hinzu:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/email-service gcloud run deploy email-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/email-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --no-allow-unauthenticated \ --max-instances=1
  1. Machen Sie deploy.sh ausführbar:
chmod u+x deploy.sh
  1. Stellen Sie den E-Mail-Dienst bereit:
./deploy.sh

Wenn die Bereitstellung abgeschlossen ist, wird eine Meldung etwa in folgender Form ausgegeben:

Service [email-service] revision [email-service-00001] has been deployed and is serving traffic at https://email-service-[hash].a.run.app

Diese Meldung zeigt an, dass der Dienst erfolgreich bereitgestellt wurde. Sie müssen nun dafür sorgen, dass der E-Mail-Dienst ausgelöst wird, wenn eine Pub/Sub-Nachricht verfügbar ist.

Klicken Sie auf Fortschritt prüfen.

E-Mail-Dienst bereitstellen: Build erstellen

Klicken Sie auf Fortschritt prüfen.

E-Mail-Dienst bereitstellen: Überarbeitung ausführen

Pub/Sub zum Auslösen des E-Mail-Dienstes konfigurieren

Der E-Mail-Dienst soll immer dann ausgelöst werden, wenn eine neue Pub/Sub-Nachricht mithilfe des Themas „new-lab-report“ veröffentlicht wurde. Dazu müssen Sie ein Dienstkonto so konfigurieren, dass es die zugehörigen Anfragen für diesen Dienst automatisch verarbeitet.

Architekturdiagramm, in dem der Weg von Cloud Pub/Sub zum E-Mail-Dienst hervorgehoben ist

  1. Erstellen Sie ein neues Dienstkonto für das Auslösen der Dienste, wenn Pub/Sub-Nachrichten veröffentlicht werden:
gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"

Klicken Sie auf Fortschritt prüfen.

Dienstkonto erstellen
  1. Gewähren Sie dem neuen Dienstkonto die Berechtigung zum Aufrufen des E-Mail-Dienstes:
gcloud run services add-iam-policy-binding email-service --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{project_0.default_region | "REGION"}}} --platform managed

Weisen Sie als Nächstes Pub/Sub an, den SMS-Dienst aufzurufen, wenn eine „new-lab-report“-Nachricht veröffentlicht wurde.

  1. Um den Zugriff zu vereinfachen, geben Sie die Projektnummer in eine Umgebungsvariable ein:
PROJECT_NUMBER=$(gcloud projects list --filter="qwiklabs-gcp" --format='value(PROJECT_NUMBER)')

Als Nächstes gewähren Sie dem Projekt die Berechtigung, Authentifizierungstokens für Pub/Sub zu erstellen.

  1. Führen Sie dazu folgenden Code aus:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com --role=roles/iam.serviceAccountTokenCreator
  1. Geben Sie die URL des E-Mail-Dienstes in eine weitere Umgebungsvariable ein:
EMAIL_SERVICE_URL=$(gcloud run services describe email-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. Prüfen Sie, ob EMAIL_SERVICE_URL erfasst wurde:
echo $EMAIL_SERVICE_URL
  1. Erstellen Sie ein Pub/Sub-Abo für den E-Mail-Dienst:
gcloud pubsub subscriptions create email-service-sub --topic new-lab-report --push-endpoint=$EMAIL_SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com

Gut gemacht! Der Dienst ist jetzt dafür eingerichtet, auf Cloud Pub/Sub-Nachrichten zu reagieren. Im nächsten Schritt müssen Sie prüfen, ob der Code die Anforderungen erfüllt.

Klicken Sie auf Fortschritt prüfen.

Pub/Sub-Abo erstellen

Laborberichtsdienst und E-Mail-Dienst zusammen testen

  1. Übergeben Sie den Laborbericht mithilfe des zuvor erstellten Scripts ein weiteres Mal:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. Öffnen Sie anschließend das Log (Navigationsmenü > Cloud Run). Ihnen werden in Ihrem Konto die beiden Cloud Run-Dienste email-service und lab-report-service angezeigt.

  2. Klicken Sie auf email-service und dann auf Logs.
    Das Ergebnis dieses von Pub/Sub ausgelösten Dienstes wird angezeigt. Wenn die erwarteten Nachrichten nicht enthalten sind, müssen Sie eventuell nach oben oder unten scrollen, um das Log zu aktualisieren.

Gut gemacht! Der E-Mail-Dienst ist nun in der Lage, Informationen in das Log zu schreiben, wenn eine Nachricht aus der Cloud Pub/Sub-Themenwarteschlange verarbeitet wurde. Als Letztes muss noch der SMS-Dienst geschrieben werden.

Aufgabe 4: Der SMS-Dienst

Unterstützen Sie Ruby bei der Einrichtung des neuen SMS-Dienstes.

SMS-Dienst im Architekturdiagramm hervorgehoben

Code für den SMS-Dienst hinzufügen

  1. Erstellen Sie ein Verzeichnis für den SMS-Dienst:
cd ~/pet-theory/lab05/sms-service
  1. Installieren Sie die für das Empfangen eingehender HTTPS-Anfragen erforderlichen Pakete:
npm install express npm install body-parser
  1. Öffnen Sie die Datei package.json.

  2. Fügen Sie im Abschnitt „scripts“ die Zeile "start": "node index.js", hinzu (wie unten gezeigt) und speichern Sie die Datei:

... "scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, ... Hinweis: Achten Sie darauf, den Code genau wie angegeben einzufügen, einschließlich des Kommas am Ende:

"start": "node index.js",

Wenn Sie dies nicht tun, treten während der Bereitstellung Fehler auf.
  1. Erstellen Sie eine neue Datei index.js und fügen Sie Folgendes hinzu:
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { const labReport = decodeBase64Json(req.body.message.data); try { console.log(`SMS Service: Report ${labReport.id} trying...`); sendSms(); console.log(`SMS Service: Report ${labReport.id} success :-)`); res.status(204).send(); } catch (ex) { console.log(`SMS Service: Report ${labReport.id} failure: ${ex}`); res.status(500).send(); } }) function decodeBase64Json(data) { return JSON.parse(Buffer.from(data, 'base64').toString()); } function sendSms() { console.log('Sending SMS'); }
  1. Erstellen Sie jetzt eine Datei mit dem Namen Dockerfile und fügen Sie folgenden Code hinzu:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

Diese Datei legt fest, wie der Cloud Run-Dienst als Paket in einem Container erstellt wird. Nachdem der Code erstellt wurde, muss als Nächstes der Dienst bereitgestellt werden.

SMS-Dienst bereitstellen

  1. Erstellen Sie eine Datei mit dem Namen deploy.sh und fügen Sie folgenden Code hinzu:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service gcloud run deploy sms-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --no-allow-unauthenticated \ --max-instances=1
  1. Machen Sie deploy.sh ausführbar:
chmod u+x deploy.sh
  1. Stellen Sie den SMS-Dienst bereit:
./deploy.sh

Wenn die Bereitstellung abgeschlossen ist, sehen Sie eine Meldung wie diese:

Service [sms-service] revision [sms-service-00001] has been deployed and is serving traffic at https://sms-service-[hash].a.run.app

Der SMS-Dienst ist nun bereitgestellt, aber nicht mit dem Cloud Pub/Sub-Dienst verknüpft. Das soll im nächsten Abschnitt geschehen.

Klicken Sie auf Fortschritt prüfen.

SMS-Dienst bereitstellen

Cloud Pub/Sub für das Auslösen des SMS-Dienstes konfigurieren

Wie beim E-Mail-Dienst muss die Verknüpfung zwischen Cloud Pub/Sub und dem SMS-Dienst so konfiguriert werden, dass die Nachrichten verarbeitet werden können.

Architekturdiagramm, in dem der Weg von Cloud Pub/Sub zum SMS-Dienst hervorgehoben ist

  1. Legen Sie für Pub/Sub Berechtigungen zum Auslösen des SMS-Dienstes fest:
gcloud run services add-iam-policy-binding sms-service --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{project_0.default_region | "REGION"}}} --platform managed

Weisen Sie als Nächstes Pub/Sub an, den SMS-Dienst aufzurufen, wenn eine „new-lab-report“-Nachricht veröffentlicht wurde.

  1. Als Erstes geben Sie dafür die URL-Adresse des SMS-Dienstes in eine Umgebungsvariable ein:
SMS_SERVICE_URL=$(gcloud run services describe sms-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. Prüfen Sie, ob SMS_SERVICE_URL erfasst wurde:

    echo $SMS_SERVICE_URL
  2. Erstellen Sie anschließend das Pub/Sub-Abo:

gcloud pubsub subscriptions create sms-service-sub --topic new-lab-report --push-endpoint=$SMS_SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
  1. Führen Sie das Testskript noch einmal aus, um drei Laborberichte an den Laborberichtsdienst zu übergeben:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. Öffnen Sie anschließend das Log (Navigationsmenü > Cloud Run). Ihnen werden in Ihrem Konto die drei Cloud Run-Dienste „email-service“, „lab-report-service“ und „sms-service“ angezeigt.

  2. Klicken Sie auf sms-service und dann auf Logs. Das Ergebnis dieses von Pub/Sub ausgelösten Dienstes wird angezeigt.

Das Prototypsystem wurde nun erstellt und erfolgreich getestet. Allerdings möchte Patrick jetzt noch im Rahmen der ersten Validierung die Ausfallsicherheit testen.

Aufgabe 5: Ausfallsicherheit des Systems testen

Was passiert, wenn einer der Dienste ausfällt? Patrick hat dies bereits erlebt, da es durchaus öfter vorkommt.

Unterstützen Sie Ruby dabei, herauszufinden, wie das System ein solches Szenario bewältigen kann. Ruby möchte prüfen, was geschieht, wenn ein Dienst fehlschlägt. Dazu stellt sie eine fehlerhafte Version des E-Mail-Dienstes bereit.

  1. Wechseln Sie wieder zum Verzeichnis email-service:
cd ~/pet-theory/lab05/email-service

Fügen Sie der E-Mail-Dienst-Anwendung ungültigen Text hinzu, um einen Fehler auszulösen.

  1. Bearbeiten Sie index.js und fügen Sie der Funktion sendEmail() die Zeile throw hinzu, wie im Folgenden dargestellt. Damit wird eine Ausnahme ausgelöst, die sich so auswirkt, als wäre der E-Mail-Server ausgefallen:
... function sendEmail() { throw 'Email server is down'; console.log('Sending email'); } ...

Durch das Hinzufügen dieser Codezeilen stützt der Dienst beim Aufruf ab.

  1. Stellen Sie diese fehlerhafte Version des E-Mail-Dienstes bereit:
./deploy.sh
  1. Wenn die Bereitstellung des E-Mail-Dienstes erfolgreich abgeschlossen wurde, übergeben Sie wieder Daten an den Laborbericht. Anschließend prüfen Sie aufmerksam den Logstatus von email-service:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. Öffnen Sie die Logs des E-Mail-Dienstes, um sich die Logs des fehlerhaften E-Mail-Dienstes anzusehen. Klicken Sie dazu auf Navigationsmenü > Cloud Run.

  2. Wenn Ihnen die drei Cloud Run-Dienste in Ihrem Konto angezeigt werden, klicken Sie auf email-service.

Der E-Mail-Dienst wird aufgerufen, stürzt aber weiterhin ab. Wenn Sie in den Logs ein Stück zurückscrollen, finden Sie die Angabe der Ursache: „Email server is down“. Außerdem sehen Sie, dass der Dienst den Statuscode 500 zurückgibt und dass Pub/Sub weiter versucht, den Dienst aufzurufen.

Wenn Sie die Logs des SMS-Dienstes prüfen, werden Sie feststellen, dass er ordnungsgemäß funktioniert.

Beheben Sie nun den Fehler im E-Mail-Dienst, um die Anwendung wiederherzustellen.

  1. Öffnen Sie die Datei index.js und entfernen Sie die zuvor eingegebene throw-Zeile. Speichern Sie anschließend die Datei.

Ihre Funktion index.js sendEmail sollte nun in etwa so aussehen:

function sendEmail() { console.log('Sending email'); }
  1. Stellen Sie die korrigierte Version des E-Mail-Dienstes bereit:
./deploy.sh
  1. Wenn die Bereitstellung abgeschlossen ist, klicken Sie auf das Symbol zum Aktualisieren rechts oben.

Sie sehen dann, wie die E-Mails für die Berichte 12, 34 und 56 letztlich gesendet wurden, der E-Mail-Dienst den Statuscode 204 zurückgegeben und Pub/Sub den Dienst nicht mehr aufgerufen hat. Es gingen keine Daten verloren. Pub/Sub hat kontinuierlich versucht, den Dienst aufzurufen, bis der Aufruf schließlich erfolgreich war. Dies ist die Basis für ein ausfallsicheres System.

Kernpunkte

  1. Wenn Dienste asynchron über Pub/Sub miteinander kommunizieren, anstatt sich gegenseitig direkt aufzurufen, wird das System dadurch ausfallsicherer.
  2. Der Trigger für den Laborberichtsdienst ist durch die Verwendung von Pub/Sub unabhängig von den anderen Diensten. Wenn Kunden beispielsweise Laborergebnisse über einen anderen Messaging-Dienst erhalten möchten, kann er ohne Änderung des Laborberichtsdienstes hinzugefügt werden.
  3. Die Wiederholung der Aufrufe wurde von Cloud Pub/Sub ausgeführt und nicht von den Diensten. Die Dienste müssen nur einen Statuscode über die erfolgreiche oder gescheiterte Ausführung zurückgeben.
  4. Wenn ein Dienst ausfällt, ist das System in der Lage, sich automatisch selbst zu „regenerieren“, sobald der Dienst aufgrund der Wiederholungsversuche von Pub/Sub wieder online verfügbar ist.

Das wars! Sie haben das Lab erfolgreich abgeschlossen.

Ruby hat mit Ihrer Hilfe erfolgreich ein ausfallsicheres Prototypsystem erstellt. Der Dienst kann nun jedem Kunden automatisch eine E-Mail- und SMS-Nachricht zustellen. Fallen einzelne Dienste zeitweilig aus, führt das System kontinuierlich den Wiederholungsmechanismus aus, sodass keine Daten verloren gehen. Und Ruby erhält die verdiente Anerkennung:

Lily

Lily, Gründerin von Pet Theory

Hallo Ruby,

ich kann dir gar nicht sagen, wie dankbar ich dir für deine intensiven Bemühungen bin. Einfach toll, wie du die Dinge in die Hand genommen hast.

In kürzester Zeit sind unsere zentralen Systeme komplett modernisiert worden.

Wir haben am Freitag ein kleines Treffen, um das zu feiern, und wir würden uns sehr freuen, wenn du unser Ehrengast sein könntest.

Lily

MelodyMelody, Managing Director

Ruby,

Pet Theory hat mir großes Lob für deine Arbeit zukommen lassen. Du bist für das Team wirklich eine Bereicherung.

Nachdem dieser Auftrag nun beendet ist, möchte ich gerne mit dir über eine höhergestellte Führungsrolle in einem neuen Projekt sprechen.

Melody

Managing Director

Computer Consulting Inc.

Weitere Informationen

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.

Handbuch zuletzt aktualisiert am 1. Februar 2024

Lab zuletzt am 20. September 2023 getestet

© 2024 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.