Sviluppo locale con Cloud Functions per Node.js mediante il codice Visual Studio

1. Panoramica

Google Cloud Functions è una piattaforma di serverless computing basata su eventi. Cloud Functions ti consente di scrivere il codice senza preoccuparti del provisioning delle risorse o della scalabilità per gestire i requisiti in evoluzione.

Le funzioni Cloud Functions scritte in JavaScript vengono eseguite in un ambiente Node.js sulla piattaforma Google Cloud. Puoi eseguire la funzione Cloud Functions in qualsiasi runtime Node.js standard per abilitare la portabilità e i test locali.

Procedura dettagliata

In questo codelab, creerai una funzione Cloud per Node.js che segnala se una temperatura specificata è accettabile o troppo alta. Creerai, testerai e debuggherai la tua funzione Cloud utilizzando Visual Studio Code sulla tua macchina locale. Infine, eseguirai il deployment della funzione sulla piattaforma Google Cloud.

Cosa imparerai a fare

  • Framework di Functions per Node.js.
  • Creare e testare una funzione Cloud Functions HTTP localmente.
  • Esegui il debug di una funzione HTTP dalla tua macchina locale.
  • Esegui il deployment di una funzione HTTP dalla tua macchina locale.

2. Configurazione e requisiti

Prerequisiti

Costi

Anche se questo codelab richiede solo un'invocazione di una funzione Cloud Functions di cui è stato eseguito il deployment, devi comunque fare riferimento alle informazioni sui prezzi dell'API Cloud Functions per comprendere il funzionamento della fatturazione.

Anche se molte API di Google possono essere utilizzate senza costi, l'utilizzo della piattaforma Google Cloud (ovvero dei suoi prodotti e delle sue API) non è senza costi. Per utilizzare Cloud Functions, devi avere un account di fatturazione attivo. Tieni presente che alcuni prodotti della piattaforma Google Cloud (GCP) dispongono di un livello "Always Free" che devi superare per generare fatturazione. Ai fini del codelab, ogni chiamata di Cloud Functions viene conteggiata per il livello gratuito. Se rispetti i limiti complessivi (all'interno di ogni mese), non dovrai sostenere alcun addebito.

3. Installa il framework Functions per Node.js

Il framework Functions per Node.js è un framework open source FaaS (Function as a Service) per la scrittura di funzioni Node.js portatili che ti viene offerto dal team di Google Cloud Functions.

Il framework di Functions ti consente di scrivere funzioni leggere eseguite in molti ambienti diversi, tra cui:

  • Google Cloud Functions
  • La tua macchina di sviluppo locale
  • Cloud Run e Cloud Run su GKE
  • Ambienti basati su Knative

Crea una nuova app Node.js.

npm init

Mentre accetti i valori predefiniti, assicurati di utilizzare index.js come punto di contatto per la tua app.

Ora installa il framework di Functions per Node.js.

npm install @google-cloud/functions-framework

Apri il file package.json. Verifica che il framework di funzioni sia elencato come dipendenza, come mostrato nell'esempio seguente.

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

Il framework di Functions è stato installato correttamente. Ora è tutto pronto per creare la funzione Cloud.

4. crea e testa una funzione Cloud Functions HTTP in locale

Creare una funzione Cloud Functions locale

In questa sezione, creerai e testerai una funzione HTTP che risponde alle richieste HTTP.

Crea un nuovo file denominato index.js nella stessa directory del file package.json.

Aggiungi quanto segue:

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);
 }
};

Ora è tutto pronto per testare la funzione.

Testare la funzione in Visual Studio Code

Da questo momento in poi, questo codelab utilizza il terminale integrato in Visual Studio Code.

In Visual Studio Code, apri una finestra del terminale.

Esegui questo comando:

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

Questo comando avvia un server locale pronto a chiamare la funzione validateTemperature quando il server riceve una richiesta HTTP.

Nella finestra del terminale dovresti vedere il seguente output:

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

Crea una seconda finestra del terminale in VS Code facendo clic sull'icona Più New Terminal nel riquadro della finestra del terminale. Dovrai passare da una finestra di terminale all'altra: la prima per gestire la funzione e la seconda per chiamare la funzione utilizzando curl.

bceb65f366d837ae.png

Puoi passare da una finestra del terminale all'altra utilizzando il menu a discesa. Se una finestra del terminale gestisce una funzione, nell'elenco a discesa la funzione viene definita node. In caso contrario, viene indicato zsh (o la shell che stai utilizzando).

Nella seconda finestra del terminale, esegui il seguente comando per inviare un payload di temperatura di 50 al server locale che gestisce la funzione validateTemperature.

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

La funzione Cloud Functions dovrebbe ricevere la seguente risposta:

Temperature OK

Nella seconda finestra del terminale, testa nuovamente la funzione inviando un payload con temperatura "troppo alta" come mostrato di seguito:

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

La funzione Cloud Functions dovrebbe ricevere la seguente risposta:

Too hot

Infine, testa la funzione chiamandola con un payload mancante.

curl -X POST http://localhost:8080

Dovresti ricevere la seguente risposta dalla funzione cloud:

Too hot

Idealmente, la funzione non dovrebbe restituire "troppo caldo" se non viene fornita alcuna temperatura. Hai scoperto un bug nel codice.

Assicurati di interrompere l'esecuzione della funzione premendo Ctrl + C nella prima finestra del terminale che la esegue.

5. Eseguire il debug di una funzione HTTP dalla macchina locale

Apri la tavolozza dei comandi in Visual Studio Code. Se stai utilizzando un Mac, usa Cmd + Shift + P. Se utilizzi Windows, usa Ctrl + Shift + P.

Digita auto attach nella tavolozza dei comandi e scegli l'elemento in primo piano nell'elenco.

601e542b4ec9f6f9.png

Per questo codelab, scegli Only With Flag come mostrato nell'immagine di seguito:

b9e6b762d150e62b.png

Ora ricarica la finestra del terminale che hai utilizzato in VS Code per svolgere la tua funzione passando il mouse sopra l'icona di avviso che appare all'estrema destra.

Fai clic su Relaunch Terminal.

37b61e3fb546fc76.png

Dalla finestra del terminale ricaricata, esegui di nuovo il framework di funzioni per pubblicare la funzione utilizzando il seguente comando:

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

in cui il flag --inspect indica a Node.js di rimanere in ascolto di un client di debug. Per saperne di più, consulta la documentazione di Node sul debug.

Tieni presente che stai utilizzando node_modules/.bin/functions-framework invece di node_modules/@google-cloud/functions-framework. Per utilizzare la modalità di ispezione, devi utilizzare l'eseguibile con link simbolico in /node_modules/.bin.

Questa volta dovresti vedere una barra di stato arancione in VS Code che indica che il debugger è collegato.

Imposta un punto di interruzione nella riga 3 facendo clic all'interno del margine a sinistra del numero di riga.

2fbb4d5916e1dbfa.png

L'icona del punto di interruzione dovrebbe illuminarsi in rosso per indicare che questa riga di codice è accessibile dal debugger.

846e6c5993cc87f9.png

Nella seconda finestra del terminale, raggiungi il punto di interruzione eseguendo il seguente comando curl.

curl -X POST http://localhost:8080 

Viene visualizzata un'evidenziazione gialla sulla riga 3. Questa evidenziazione indica che questa riga è l'istruzione corrente valutata dal debugger.

206c7ed1eb189e90.png

Passa il mouse sopra la variabile temp per verificare che i relativi contenuti siano undefined, poiché la richiesta non ha fornito un payload della temperatura.

97979025f4bf2842.png

Fai clic sull'icona di ignoramento per eseguire l'istruzione successiva.

Vedrai che l'istruzione corrente passa alla parte else dell'istruzione if.

cf0e8ce7e0388f98.png

Per questa demo, puoi assumere che la specifica richieda a tutte le richieste di inviare una lettura della temperatura. Nell'improbabile caso in cui non venga fornita una lettura della temperatura, la funzione dovrebbe generare un'eccezione.

Fai clic sul pulsante Scollega per scollegare il debugger.

1070d059775ad769.png

Nella prima finestra del terminale, interrompi l'esecuzione della funzione premendo Ctrl + C.

Aggiorna la funzione aggiungendo un'istruzione if per generare un'eccezione se la temperatura non è definita, come mostrato di seguito:

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

 try {

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

 ...

Nella prima finestra del terminale, inizia a eseguire nuovamente la funzione Cloud Functions eseguendo il comando seguente senza il flag –inspect per evitare di collegare il debugger.

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

Verifica che venga lanciata un'eccezione eseguendo il seguente comando nella seconda finestra del terminale:

curl -X POST http://localhost:8080 

Dovresti vedere il seguente output restituito dalla richiesta:

Temperature is undefined

Nella prima finestra del terminale vedrai anche l'errore registrato dalla funzione.

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

Ora puoi interrompere l'esecuzione della funzione premendo Ctrl + C nella prima finestra del terminale.

6. Esegui il deployment di una funzione HTTP dalla tua macchina locale a Google Cloud

Ora che hai creato, testato ed eseguito il debug di una funzione Cloud Functions sulla tua macchina locale, puoi eseguirne il deployment in Google Cloud.

Verifica di utilizzare localmente il progetto creato nel passaggio 2 eseguendo questo comando:

gcloud config get-value project

Se il progetto specificato nel passaggio 2 non è la configurazione attiva, esegui il seguente comando:

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

In una finestra del terminale, esegui il seguente comando:

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

dove i parametri sono spiegati come segue:

  • deploy validateTemperature: il sottocomando gcloud per il deployment di una Funzione Cloud con il nome validateTemperature e un punto di contatto denominato validateTemperature
  • --trigger-http: il tipo di evento di attivazione
  • --runtime nodejs12: il runtime target per questa funzione
  • --allow-unauthenticated: consente all'accesso pubblico per chiamare la funzione

Ti verrà chiesto di abilitare le API Cloud Functions. Digita y per abilitare le API.

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 

Al termine del deployment, nell'output viene visualizzato quanto segue:

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

Nella finestra del terminale, utilizza curl per chiamare questo endpoint pubblico.

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

e conferma che il deployment della funzione Cloud Functions sia stato eseguito correttamente verificando la risposta appropriata.

Temperature OK

7. Esegui la pulizia

Per evitare addebiti involontari, ad esempio se questa funzione Cloud Functions viene richiamata inavvertitamente più volte rispetto all'allocazione mensile dei richiami della funzione Cloud Functions nel livello senza costi, puoi eliminare la funzione Cloud Functions o eliminare il progetto che hai creato nel passaggio 2.

Per eliminare la funzione Cloud, vai alla console Cloud Functions all'indirizzo https://console.cloud.google.com/functions/. Assicurati che il progetto che hai creato nel passaggio 2 sia quello attualmente selezionato.

Seleziona la funzione validateTemperature di cui hai eseguito il deployment nel passaggio 6. Quindi, premi Elimina.

4dada486485a935a.png

Se scegli di eliminare l'intero progetto, puoi andare alla pagina https://console.cloud.google.com/cloud-resource-manager, selezionare il progetto creato nel passaggio 2 e scegliere Elimina. Se elimini il progetto, dovrai modificarli in Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list.

8. Complimenti!

Complimenti per aver completato il codelab. Scopri di più su come Cloud Functions supporta il runtime Node.js e su come funziona il debug locale con Cloud Functions.

Argomenti trattati

  • Framework di Functions per Node.js.
  • Creare e testare una funzione Cloud Functions HTTP localmente.
  • Esegui il debug di una funzione HTTP dalla tua macchina locale.
  • Esegui il deployment di una funzione HTTP dalla tua macchina locale.