Lokale Entwicklung mit Cloud Functions für Node.js und Visual Studio Code

1. Übersicht

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

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.

Schritt-für-Schritt-Anleitung

In diesem Codelab erstellen Sie eine Cloud Functions-Funktion für Node.js, die meldet, ob eine angegebene Temperatur akzeptabel oder zu heiß ist. Sie erstellen, testen und debuggen Ihre Cloud Functions-Funktion mithilfe von Visual Studio Code auf Ihrem lokalen Computer. Zum Schluss stellen Sie die Funktion auf der Google Cloud Platform bereit.

Aufgaben in diesem Lab

  • Functions Framework für Node.js
  • HTTP-Cloud Functions-Funktion lokal erstellen und testen
  • Beheben Sie Fehler an einer HTTP-Funktion auf Ihrem lokalen Computer.
  • HTTP-Funktion von Ihrem lokalen Computer bereitstellen

2. Einrichtung und Anforderungen

Voraussetzungen

Kosten

Für dieses Codelab ist nur ein Aufruf einer bereitgestellten Cloud Functions-Funktion erforderlich. Sie sollten aber dennoch die Preisinformationen für die Cloud Functions API heranziehen, um die Funktionsweise der Abrechnung zu verstehen.

Viele Google APIs können kostenlos genutzt werden, die Nutzung der Google Cloud Platform, also der Produkte und APIs, ist jedoch nicht kostenlos. Sie benötigen ein aktives Rechnungskonto, um Cloud Functions nutzen zu können. Beachten Sie, dass bestimmte Google Cloud Platform-Produkte (GCP-Produkte) die Stufe "Immer kostenlos" umfassen, die überschritten werden muss, damit Kosten anfallen. Im Rahmen des Codelabs wird jeder Cloud Functions-Aufruf auf dieses kostenlose Kontingent angerechnet. Solange Sie insgesamt (innerhalb eines Monats) innerhalb der Limits bleiben, sollten keine Kosten anfallen.

3. Functions Framework für Node.js installieren

Functions Framework für Node.js ist ein Open-Source-FaaS-Framework (Function as a Service) zum Schreiben portierbarer Node.js-Funktionen, das Ihnen vom Google Cloud Functions-Team zur Verfügung gestellt wird.

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

Beim Akzeptieren der Standardeinstellungen musst du index.js als Einstiegspunkt für deine App 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 folgenden Beispiel gezeigt.

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

Das Functions Framework wurde jetzt erfolgreich installiert. Sie können jetzt Ihre Cloud Functions-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 eine neue Datei mit dem Namen index.js im selben Verzeichnis wie die Datei „package.json“.

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 jetzt 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 ein Terminalfenster derzeit eine Funktion bereitstellt, wird sie in der Drop-down-Liste als node bezeichnet. Andernfalls wird sie 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 Functions-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 zum Schluss die Funktion, indem Sie sie mit einer fehlenden Nutzlast aufrufen.

curl -X POST http://localhost:8080

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

Too hot

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

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. Fehler in einer HTTP-Funktion auf dem lokalen Computer beheben

Ö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 oberste 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

Aktualisieren Sie nun das Terminalfenster, das Sie in VS Code verwendet haben, um die Funktion bereitzustellen. Bewegen Sie dazu den Mauszeiger auf das Warnsymbol, das ganz rechts angezeigt wird.

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.

Beachten Sie, dass Sie node_modules/.bin/functions-framework anstelle von node_modules/@google-cloud/functions-framework verwenden. Um den Prüfmodus nutzen zu können, müssen Sie die automatisch mit Synonyme verknüpfte ausführbare Datei in /node_modules/.bin 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

Treffen Sie im zweiten Terminalfenster den Haltepunkt, indem Sie den folgenden curl-Befehl ausführen.

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.

Sie sehen, dass die aktuelle Anweisung zum else-Teil der if-Anweisung springt.

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

1070d059775ad769.png

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

Aktualisieren Sie Ihre Funktion, um eine if-Anweisung hinzuzufügen, die eine Ausnahme auslöst, wenn die Temperatur nicht definiert ist, wie unten gezeigt:

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

 try {

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

 ...

Starten Sie die Cloud Functions-Funktion im ersten Terminalfenster noch einmal, indem Sie den folgenden Befehl ohne das Flag „-Inspect“ ausführen, damit der Debugger nicht angehängt wird.

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

Überprüfen Sie, ob eine Ausnahme ausgelöst wurde, indem Sie den folgenden Befehl im zweiten Terminalfenster ausführen:

curl -X POST http://localhost:8080 

Sie sollten die folgende Ausgabe der Anfrage 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 Functions-Funktion auf Ihrem lokalen Computer erstellt, getestet und debuggen 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 beliebigen Terminalfenster den folgenden Befehl aus:

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

Dabei werden die Parameter wie folgt erläutert:

  • deploy validateTemperature: der gcloud-Unterbefehl zum Bereitstellen einer Cloud Functions-Funktion mit dem Namen validateTemperature und einem Einstiegspunkt mit dem Namen validateTemperature
  • --trigger-http – der Typ des auslösenden Ereignisses
  • --runtime nodejs12 – die Ziellaufzeit für diese Funktion
  • --allow-unauthenticated: Ermöglicht den öffentlichen Zugriff zum Aufrufen der 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 

Sobald die Bereitstellung abgeschlossen ist, 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 im Terminalfenster mit curl auf.

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

und bestätigen Sie, dass Ihre Cloud Functions-Funktion erfolgreich bereitgestellt wurde. Überprüfen Sie dazu die entsprechende Antwort.

Temperature OK

7. Bereinigen

Um versehentliche Gebühren zu vermeiden, z.B. wenn diese Cloud Functions-Funktion versehentlich häufiger aufgerufen wird als Ihre monatliche Zuweisung von Cloud Functions-Aufrufen in der kostenlosen Stufe, können Sie entweder die Cloud Functions-Funktion oder das in Schritt 2 erstellte Projekt löschen.

Rufen Sie zum Löschen der Cloud Functions-Funktion die Cloud Console 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 „validTemperature“ 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
  • Beheben Sie Fehler an einer HTTP-Funktion auf Ihrem lokalen Computer.
  • HTTP-Funktionen vom lokalen Computer aus bereitstellen