GSP650
Übersicht
Den Labs des Kurses
Serverlose Anwendungen in Cloud Run entwickeln
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 möchte diesen Vorgang deshalb optimieren.
Derzeit verarbeitet Patrick, der IT-Administrator von Pet Theory, die
Testergebnisse manuell. Wenn diese aus den Laboren zurückkommen, stellt er sie
zusammen und schickt eine E-Mail an die Besitzerin oder den Besitzer des
Tieres. Anschließend schreibt er eine SMS auf seinem Smartphone und sendet die
Ergebnisse in Textform an die jeweilige Person.
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-Dienste zum Veröffentlichen und Empfangen von Nachrichten
erstellen
- Pub/Sub-Abo erstellen, das einen Cloud Run-Dienst auslöst
- Ausfallsicherheit des Systems testen
Vorbereitung
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 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 rechten Seite befindet sich der Bereich Lab-Einrichtung und ‑Zugriff:
- Button Google Cloud Console öffnen
- Die temporären Anmeldedaten (Nutzername und Passwort), die Sie für dieses Lab verwenden müssen
- Gegebenenfalls weitere Informationen für dieses Lab
Der Lab-Timer befindet sich oben auf der Seite und zeigt die verbleibende Zeit an.
-
Klicken Sie auf Google Cloud Console öffnen. Wenn Sie Chrome verwenden, können Sie auch rechtsklicken und Link in Inkognitofenster öffnen auswählen.
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 Lab-Einrichtung und ‑Zugriff.
-
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 Lab-Einrichtung und ‑Zugriff.
-
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 2-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.
Region und Zone einrichten
Bestimmte Compute Engine-Ressourcen befinden sich in Regionen und Zonen. Eine Region ist ein bestimmter 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 Cloud Shell 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
Kundinnen und Kunden automatisieren. Zuletzt hatte die Klinik Mühe, die
steigende Anzahl an Terminen zu bewältigen. Lily bittet deshalb Ruby um
Unterstützung:
|
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 Kundinnen und Kunden zu
senden.
Lily
|
|
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.
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:
-
Die HTTP POST-Anfrage empfangen und den Eingang gegenüber dem medizinischen
Labor bestätigen
-
Eine E-Mail mit den Testergebnissen an die Kundin oder den Kunden senden
-
Eine SMS und eine E-Mail mit den Testergebnissen an die Kundin oder 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 die Kundin
oder den Kunden
- Ein Dienst zum Senden einer SMS an die Kundin oder 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, Softwareberaterin
|
Hallo Patrick,
Lily möchte, 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, 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.
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.
- 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.
-
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, 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, 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.
Da dieser Dienst für einen Prototyp vorgesehen ist, müssen mit ihm nur zwei
Aufgaben ausgeführt werden:
-
Empfangen der HTTPS POST-Anfrage für den Laborbericht mit den Berichtsdaten
- Veröffentlichen einer Nachricht in Pub/Sub
Code für den Laborberichtsdienst hinzufügen
- Zurück in der Cloud Shell klonen Sie das Repository für dieses Lab:
git clone https://github.com/rosera/pet-theory.git
- Wechseln Sie zum Verzeichnis
lab-service:
cd pet-theory/lab05/lab-service
-
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.
-
Öffnen Sie die Datei package.json.
-
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.
-
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);
}
Diese beiden Zeilen definieren die Hauptaufgaben des Dienstes:
const labReport = req.body;
await publishPubSubMessage(labReport);
Die Hauptaufgaben sind:
- Extrahieren des Laborberichts aus der POST-Anfrage
-
Veröffentlichen einer Pub/Sub-Nachricht mit dem aktuell übergebenen
Laborbericht
-
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
-
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 \
--region {{{project_0.default_region | "REGION"}}} \
--allow-unauthenticated \
--max-instances=1
-
Führen Sie in der Cloud Shell den folgenden Befehl aus, um die Datei
ausführbar zu machen:
chmod u+x deploy.sh
-
Nun kann der Laborberichtsdienst bereitgestellt werden. Führen Sie dazu das
Bereitstellungsscript 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 Meldung 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. Jetzt können Sie 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.
-
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 --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
- Prüfen Sie, ob LAB_REPORT_SERVICE_URL erfasst wurde:
echo $LAB_REPORT_SERVICE_URL
-
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 Script verwendet den Befehl curl zur Übergabe dreier
unterschiedlicher IDs an die Labordienst-URL. Jeder Befehl wird einzeln im
Hintergrund ausgeführt.
- Machen Sie das Script
post-reports.sh ausführbar:
chmod u+x post-reports.sh
-
Testen Sie nun den Endpunkt des Laborberichtsdienstes durch Übergabe von
drei Laborberichten an den Dienst mit dem oben dargestellten Script:
./post-reports.sh
Dieses Script übergibt drei Laborberichte an Ihren Laborberichtsdienst. Prüfen
Sie in den Logs die Ergebnisse.
-
Klicken Sie in der Cloud Console auf
Navigationsmenü (
) > Cloud Run.
-
Der neu bereitgestellte Dienst lab-report-service sollte
jetzt in der Liste Dienste angezeigt werden. Klicken Sie
darauf.
-
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 Script ü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
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.
Code für den E-Mail-Dienst hinzufügen
- Wechseln Sie zum Verzeichnis des E-Mail-Dienstes:
cd ~/pet-theory/lab05/email-service
-
Installieren Sie die folgenden Pakete, damit der Code eingehende
HTTPS-Anfragen verarbeiten kann:
npm install express
npm install body-parser
Mit dem obigen Befehl 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.
-
Öffnen Sie die Datei package.json.
-
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.
-
Erstellen Sie eine neue Datei namens
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 der Funktion sendEmail() Code hinzu,
damit die E-Mail auch gesendet wird.
-
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
-
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 \
--region {{{project_0.default_region | "REGION"}}} \
--no-allow-unauthenticated \
--max-instances=1
- Machen Sie
deploy.sh ausführbar:
chmod u+x deploy.sh
- Stellen Sie den E-Mail-Dienst bereit:
./deploy.sh
Wenn die Bereitstellung abgeschlossen ist, wird eine Meldung wie diese
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.
-
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
-
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"}}}
Weisen Sie als Nächstes Pub/Sub an, den SMS-Dienst aufzurufen, wenn eine
„new-lab-report“-Nachricht veröffentlicht wurde.
-
Geben Sie die Projektnummer in eine Umgebungsvariable ein, um den Zugriff zu
vereinfachen:
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.
- 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
-
Geben Sie die URL des E-Mail-Dienstes in eine weitere Umgebungsvariable ein:
EMAIL_SERVICE_URL=$(gcloud run services describe email-service --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
- Prüfen Sie, ob EMAIL_SERVICE_URL erfasst wurde:
echo $EMAIL_SERVICE_URL
- 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
-
Übergeben Sie den Laborbericht mithilfe des zuvor erstellten Scripts ein
weiteres Mal:
~/pet-theory/lab05/lab-service/post-reports.sh
-
Ö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.
-
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.
Code für den SMS-Dienst hinzufügen
- Erstellen Sie ein Verzeichnis für den SMS-Dienst:
cd ~/pet-theory/lab05/sms-service
-
Installieren Sie die für das Empfangen eingehender HTTPS-Anfragen
erforderlichen Pakete:
npm install express
npm install body-parser
-
Öffnen Sie die Datei package.json.
-
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.
-
Erstellen Sie eine neue Datei namens
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');
}
-
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
-
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 \
--region {{{project_0.default_region | "REGION"}}} \
--no-allow-unauthenticated \
--max-instances=1
- Machen Sie
deploy.sh ausführbar:
chmod u+x deploy.sh
- 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.
-
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"}}}
Als Nächstes weisen Sie Pub/Sub an, den SMS-Dienst aufzurufen, wenn eine
„new-lab-report“-Nachricht veröffentlicht wurde.
-
Geben Sie dafür als Erstes die URL-Adresse des SMS-Dienstes in eine
Umgebungsvariable ein:
SMS_SERVICE_URL=$(gcloud run services describe sms-service --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
-
Prüfen Sie, ob SMS_SERVICE_URL erfasst wurde:
echo $SMS_SERVICE_URL
-
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
-
Führen Sie das Testscript noch einmal aus, um drei Laborberichte an den
Laborberichtsdienst zu übergeben:
~/pet-theory/lab05/lab-service/post-reports.sh
-
Ö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.
-
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.
- 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.
-
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ürzt der Dienst beim Aufruf ab.
- Stellen Sie diese fehlerhafte Version des E-Mail-Dienstes bereit:
./deploy.sh
-
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
-
Öffnen Sie die Logs des E-Mail-Dienstes, um sich die Logs des fehlerhaften
E-Mail-Dienstes anzusehen. Klicken Sie dazu im
Navigationsmenü auf Cloud Run.
-
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.
-
Öffnen Sie die Datei
index.js und entfernen Sie die zuvor
eingegebene throw-Zeile. Speichern Sie anschließend die Datei.
Ihre Funktion sendEmail in index.js sollte nun in
etwa so aussehen:
function sendEmail() {
console.log('Sending email');
}
- Stellen Sie die korrigierte Version des E-Mail-Dienstes bereit:
./deploy.sh
-
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
-
Wenn Dienste asynchron über Pub/Sub miteinander kommunizieren, anstatt sich
gegenseitig direkt aufzurufen, wird das System dadurch ausfallsicherer.
-
Der Trigger für den Laborberichtsdienst ist durch die Verwendung von Pub/Sub
unabhängig von den anderen Diensten. Wenn Kundinnen und Kunden
beispielsweise Laborergebnisse über einen anderen Messaging-Dienst erhalten
möchten, kann er ohne Änderung des Laborberichtsdienstes hinzugefügt werden.
-
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.
-
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 allen Kundinnen und 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, Gründerin von Pet Theory
|
Hallo Ruby,
ich kann dir gar nicht sagen, wie dankbar ich dir für dein Engagement
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
|
|
Melody, Managing Director
|
Hallo 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 gern 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.
Anleitung zuletzt am 23. Juli 2024 aktualisiert
Lab zuletzt am 23. Juli 2024 getestet
© 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.