Lokale Entwicklung mit Cloud Functions for Node.js mit Visual Studio Code

1. Übersicht

Google Cloud Functions ist eine ereignisgesteuerte serverlose Computing-Plattform. Mit Cloud Functions können Sie Ihren Code schreiben, ohne sich um die Bereitstellung von Ressourcen oder die Skalierung kümmern zu müssen, um sich an sich ändernde Anforderungen anzupassen.

Cloud Functions, die in JavaScript geschrieben sind, werden in einer Node.js-Umgebung auf der Google Cloud Platform ausgeführt. Sie können Ihre Cloud-Funktion in jeder standardmäßigen Node.js-Laufzeit ausführen, um Portabilität und lokales Testen zu ermöglichen.

Anleitung

In diesem Codelab erstellen Sie eine Cloud Function für Node.js, die meldet, ob eine angegebene Temperatur akzeptabel oder zu heiß ist. Sie erstellen, testen und beheben Fehler in Ihrer Cloud-Funktion mit Visual Studio Code auf Ihrem lokalen Computer. Zum Schluss stellen Sie die Funktion in der Google Cloud Platform bereit.

Aufgaben in diesem Lab

  • Functions Framework für Node.js.
  • HTTP-Cloud Functions-Funktion lokal erstellen und testen
  • HTTP-Funktionen auf dem lokalen Computer debuggen
  • HTTP-Funktionen vom lokalen Computer aus bereitstellen

2. Einrichtung und Anforderungen

Voraussetzungen

Kosten

In diesem Codelab ist nur ein Aufruf einer bereitgestellten Cloud-Funktion erforderlich. Sie sollten sich jedoch die Preisinformationen zur Cloud Functions API ansehen, um mehr über die Abrechnung zu erfahren.

Viele Google APIs können kostenlos verwendet werden, die Nutzung der Google Cloud-Plattform (d.h. ihrer Produkte und APIs) ist jedoch nicht kostenlos. Sie benötigen ein aktives Rechnungskonto, um Cloud Functions verwenden zu können. Bestimmte Google Cloud Platform-Produkte (GCP) bieten eine „Immer kostenlos“-Stufe, die Sie überschreiten müssen, damit Kosten anfallen. Im Rahmen des Codelabs wird jeder Cloud Functions-Aufruf auf dieses kostenlose Kontingent angerechnet. Solange Sie die Limits insgesamt (innerhalb eines jeden Monats) einhalten, fallen keine Kosten an.

3. Functions Framework für Node.js installieren

Das Functions Framework für Node.js ist ein Open-Source-FaaS-Framework (Function as a Service) zum Schreiben portabler Node.js-Funktionen, das vom Google Cloud Functions-Team entwickelt wurde.

Mit Functions Framework können Sie einfache Funktionen schreiben, die in vielen verschiedenen Umgebungen ausgeführt werden, darunter:

  • Google Cloud Functions
  • Ihre lokale Entwicklungsmaschine
  • Cloud Run und Cloud Run in GKE
  • Knative-basierte Umgebungen

Erstellen Sie eine neue Node.js-Anwendung.

npm init

Achten Sie beim Akzeptieren der Standardeinstellungen darauf, index.js als Einstiegspunkt für Ihre App zu verwenden.

Installieren Sie nun das Functions Framework für Node.js.

npm install @google-cloud/functions-framework

Öffnen Sie die Datei „package.json“. Prüfen Sie, ob das Functions Framework als Abhängigkeit aufgeführt ist, wie im Beispiel unten gezeigt.

"dependencies": {
   "@google-cloud/functions-framework": "^1.7.1"
 }

Das Functions Framework wurde jetzt erfolgreich installiert. Sie können jetzt Ihre Cloud-Funktion erstellen.

4. HTTP-Cloud Functions-Funktion lokal erstellen und testen

Lokale Cloud Functions-Funktion erstellen

In diesem Abschnitt erstellen und testen Sie eine HTTP-Funktion, die auf HTTP-Anfragen reagiert.

Erstellen Sie im selben Verzeichnis wie die Datei „package.json“ eine neue Datei mit dem Namen index.js.

Geben Sie folgende Ausdrücke ein. (Verwenden Sie hier und im weiteren Verlauf des Labs jeweils nur die englischen Begriffe):

exports.validateTemperature = async (req, res) => {
 try {
   if (req.body.temp < 100) {
     res.status(200).send("Temperature OK");
   } else {
     res.status(200).send("Too hot");
   }
 } catch (error) {
   //return an error
   console.log("got error: ", error);
   res.status(500).send(error);
 }
};

Sie können jetzt die Funktion testen.

Funktion in Visual Studio Code testen

Ab diesem Punkt wird in diesem Codelab das integrierte Terminal in Visual Studio Code verwendet.

Öffnen Sie in Visual Studio Code ein Terminalfenster.

Führen Sie dazu diesen Befehl aus:

node node_modules/@google-cloud/functions-framework --target=validateTemperature

Mit diesem Befehl wird ein lokaler Server gestartet, der die validateTemperature-Funktion aufruft, wenn der Server eine HTTP-Anfrage empfängt.

Im Terminalfenster sollte folgende Ausgabe angezeigt werden:

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

Klicken Sie im Bereich „Terminalfenster“ auf das Pluszeichen New Terminal, um ein zweites Terminalfenster in VS Code zu erstellen. Sie wechseln zwischen diesen beiden Terminalfenstern: das erste zum Bereitstellen der Funktion und das zweite zum Aufrufen der Funktion mit curl.

bceb65f366d837ae.png

Über das Drop-down-Menü können Sie zwischen den Terminalfenstern wechseln. Wenn in einem Terminalfenster derzeit eine Funktion ausgeführt wird, wird es in der Drop-down-Liste als node bezeichnet. Andernfalls wird auf zsh (oder die von Ihnen verwendete Shell) verwiesen.

Führen Sie im zweiten Terminalfenster den folgenden Befehl aus, um eine Temperaturnutzlast von 50 an den lokalen Server zu senden, der die validateTemperature-Funktion ausführt.

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

Sie sollten die folgende Antwort von der Cloud-Funktion erhalten:

Temperature OK

Testen Sie die Funktion im zweiten Terminalfenster noch einmal, indem Sie eine Temperaturnutzlast mit dem Wert „zu hoch“ senden, wie unten gezeigt:

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"120"}'

Sie sollten die folgende Antwort von der Cloud-Funktion erhalten:

Too hot

Testen Sie abschließend die Funktion, indem Sie sie mit einer fehlenden Nutzlast aufrufen.

curl -X POST http://localhost:8080

Sie sollten die folgende Antwort von der Cloud-Funktion erhalten:

Too hot

Idealerweise sollte die Funktion nicht „zu heiß“ zurückgeben, wenn keine Temperatur angegeben ist. Sie haben einen Fehler im Code gefunden.

Beenden Sie die Ausführung der Funktion, indem Sie im ersten Terminalfenster, in dem die Funktion ausgeführt wird, die Taste Ctrl + C drücken.

5. HTTP-Funktionen vom lokalen Computer aus debuggen

Öffnen Sie die Befehlspalette in Visual Studio Code. Auf einem Mac verwenden Sie Cmd + Shift + P. Unter Windows: Ctrl + Shift + P.

Geben Sie auto attach in die Befehlspalette ein und wählen Sie das erste Element in der Liste aus.

601e542b4ec9f6f9.png

Wählen Sie für dieses Codelab Only With Flag aus, wie in der Abbildung unten dargestellt:

b9e6b762d150e62b.png

Laden Sie jetzt das Terminalfenster neu, das Sie in VS Code zum Ausführen Ihrer Funktion verwendet haben. Bewegen Sie dazu den Mauszeiger auf das Warnsymbol ganz rechts.

Klicken Sie auf Relaunch Terminal.

37b61e3fb546fc76.png

Führen Sie im neu geladenen Terminalfenster das Functions Framework noch einmal aus, um Ihre Funktion mit dem folgenden Befehl auszuführen:

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

Das Flag --inspect weist Node.js an, auf einen Debugging-Client zu warten. Weitere Informationen finden Sie in der Node-Dokumentation zum Debuggen.

Sie verwenden node_modules/.bin/functions-framework anstelle von node_modules/@google-cloud/functions-framework. Sie müssen die automatisch symlinkierte ausführbare Datei in /node_modules/.bin verwenden, um den Inspektionsmodus zu verwenden.

Diesmal sollte in VS Code eine orangefarbene Statusleiste angezeigt werden, die angibt, dass der Debugger verbunden ist.

Legen Sie einen Haltepunkt in Zeile 3 fest, indem Sie links neben der Zeilennummer auf den Rand klicken.

2fbb4d5916e1dbfa.png

Das Symbol für den Haltepunkt sollte hellrot leuchten, was bedeutet, dass der Debugger auf diese Codezeile zugreifen kann.

846e6c5993cc87f9.png

Führen Sie im zweiten Terminalfenster den folgenden curl-Befehl aus, um den Haltepunkt zu erreichen.

curl -X POST http://localhost:8080 

Über Zeile 3 wird eine gelbe Markierung angezeigt. Diese Hervorhebung gibt an, dass diese Zeile die aktuelle Anweisung ist, die vom Debugger ausgewertet wird.

206c7ed1eb189e90.png

Bewegen Sie den Mauszeiger auf die Variable „temp“, um zu prüfen, ob ihr Inhalt undefined ist, da die Anfrage keine Temperaturnutzlast enthält.

97979025f4bf2842.png

Klicken Sie auf das Symbol „Überspringen“, um die nächste Anweisung auszuführen.

Die aktuelle Anweisung springt zum else-Teil der if-Anweisung.

cf0e8ce7e0388f98.png

Für diese Demo können Sie davon ausgehen, dass gemäß der Spezifikation alle Anfragen eine Temperaturmessung senden müssen. Für den unwahrscheinlichen Fall, dass keine Temperaturmessung verfügbar ist, sollte die Funktion eine Ausnahme auslösen.

Klicken Sie auf die Schaltfläche „Verbindung trennen“, um die Verbindung zum Debugger zu trennen.

1070d059775ad769.png

Beenden Sie im ersten Terminalfenster die Ausführung der Funktion, indem Sie Ctrl + C drücken.

Aktualisieren Sie die Funktion, indem Sie eine If-Bedingung hinzufügen, die eine Ausnahme auslöst, wenn „temperature“ nicht definiert ist (siehe unten):

exports.validateTemperature = async (req, res) => {

 try {

   // add this if statement below line #2
   if (!req.body.temp) {
     throw "Temperature is undefined";
   }

 ...

Führen Sie in Ihrem ersten Terminalfenster die Cloud-Funktion noch einmal aus, indem Sie den folgenden Befehl ohne das Flag „–inspect“ ausführen, um das Anhängen des Debuggers zu vermeiden.

node node_modules/@google-cloud/functions-framework --target=validateTemperature

Prüfen Sie, ob eine Ausnahme ausgelöst wird, indem Sie in Ihrem zweiten Terminalfenster den folgenden Befehl ausführen:

curl -X POST http://localhost:8080 

Sie sollten die folgende Ausgabe sehen:

Temperature is undefined

Im ersten Terminalfenster sehen Sie auch den von Ihrer Funktion protokollierten Fehler.

Serving function...
Function: validateTemperature
URL: http://localhost:8080/
got error:  Temperature is undefined

Sie können die Ausführung der Funktion jetzt beenden, indem Sie im ersten Terminalfenster Strg + C drücken.

6. HTTP-Funktion von Ihrem lokalen Computer in Google Cloud bereitstellen

Nachdem Sie eine Cloud-Funktion auf Ihrem lokalen Computer erstellt, getestet und debuggt haben, können Sie sie in Google Cloud bereitstellen.

Prüfen Sie, ob Sie das in Schritt 2 erstellte Projekt lokal verwenden. Führen Sie dazu den folgenden Befehl aus:

gcloud config get-value project

Wenn das in Schritt 2 angegebene Projekt nicht die aktive Konfiguration ist, führen Sie den folgenden Befehl aus:

gcloud config set project <project-name-created-step-2>

Führen Sie in einem Terminalfenster den folgenden Befehl aus:

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

Die Parameter werden hier erläutert:

  • deploy validateTemperature: gcloud-Unterbefehl zum Bereitstellen einer Cloud-Funktion mit dem Namen validateTemperature und dem Einstiegspunkt validateTemperature
  • --trigger-http – der Typ des auslösenden Ereignisses
  • --runtime nodejs12: die angestrebte Laufzeit für diese Funktion
  • --allow-unauthenticated – erlaubt den öffentlichen Zugriff auf die Funktion

Sie werden aufgefordert, die Cloud Functions APIs zu aktivieren. Geben Sie y ein, um die APIs zu aktivieren.

API [cloudfunctions.googleapis.com] not enabled on project 
[1057316433766]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)? y 

Nach Abschluss der Bereitstellung wird in der Ausgabe Folgendes angezeigt:

Deploying function (may take a while - up to 2 minutes)...done. 
availableMemoryMb: 256
buildId: <your-build-id>
entryPoint: validateTemperature
httpsTrigger:
  url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature
...

Rufen Sie diesen öffentlichen Endpunkt in Ihrem Terminalfenster mit curl auf.

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

Prüfen Sie, ob Ihre Cloud-Funktion erfolgreich bereitgestellt wurde, indem Sie die entsprechende Antwort überprüfen.

Temperature OK

7. Bereinigen

Wenn Sie versehentliche Kosten vermeiden möchten, z.B. wenn diese Cloud-Funktion versehentlich mehrmals aufgerufen wird als Ihr monatliches Kontingent für Cloud Functions-Aufrufe im kostenlosen Tarif, können Sie entweder die Cloud-Funktion oder das in Schritt 2 erstellte Projekt löschen.

Wenn Sie die Cloud-Funktion löschen möchten, rufen Sie die Cloud Console für Cloud Functions unter https://console.cloud.google.com/functions/ auf. Achten Sie darauf, dass das in Schritt 2 erstellte Projekt das aktuell ausgewählte Projekt ist.

Wählen Sie die Funktion „validateTemperature“ aus, die Sie in Schritt 6 bereitgestellt haben. Klicken Sie dann auf „Löschen“.

4dada486485a935a.png

Wenn Sie das gesamte Projekt löschen möchten, rufen Sie https://console.cloud.google.com/cloud-resource-manager auf, wählen Sie das in Schritt 2 erstellte Projekt aus und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie die Projekte in Ihrem Cloud SDK ändern. Sie können eine Liste aller verfügbaren Projekte mit dem Befehl „gcloud projects list“ aufrufen.

8. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs. Weitere Informationen dazu, wie Cloud Functions die Node.js-Laufzeit unterstützt, finden Sie hier. Weitere Informationen zum lokalen Debuggen mit Cloud Functions

Behandelte Themen

  • Functions Framework für Node.js.
  • HTTP-Cloud Functions-Funktion lokal erstellen und testen
  • HTTP-Funktionen auf dem lokalen Computer debuggen
  • HTTP-Funktionen vom lokalen Computer aus bereitstellen