Sviluppo locale con Cloud Functions per Node.js utilizzando Visual Studio Code

1. Panoramica

Google Cloud Functions è una piattaforma di calcolo serverless 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 tua 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.
  • Crea e testa una funzione Cloud HTTP in locale.
  • 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 capire come funziona la fatturazione.

Sebbene molte API Google possano essere utilizzate senza costi, l'utilizzo della piattaforma Google Cloud (ovvero dei relativi prodotti e API) non è senza costi. Per utilizzare Cloud Functions, devi disporre di 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 senza costi. Se rispetti i limiti complessivi (all'interno di ogni mese), non dovrai sostenere alcun addebito.

3. Installa il framework Functions per Node.js

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

Il framework di Functions ti consente di scrivere funzioni leggere che vengono 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 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 Functions è stato installato correttamente. Ora è tutto pronto per creare la funzione Cloud.

4. Creare e testare una funzione Cloud HTTP in locale

Creare una funzione Cloud 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 punto 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. Passerai da una finestra del terminale all'altra: la prima per eseguire la funzione e la seconda per chiamarla utilizzando curl.

bceb65f366d837ae.png

Puoi passare da una finestra del terminale all'altra utilizzando il menu a discesa. Se una finestra del terminale sta attualmente eseguendo una funzione, l'elenco a discesa la indica come node. In caso contrario, viene fatto riferimento a zsh (o alla shell in uso).

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"}'

Dovresti ricevere la seguente risposta dalla funzione cloud:

Temperature OK

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

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

Dovresti ricevere la seguente risposta dalla funzione cloud:

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 utilizzi un Mac, usa Cmd + Shift + P. Se utilizzi Windows, usa Ctrl + Shift + P.

Digita auto attach nel riquadro dei comandi e scegli l'elemento in alto 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 eseguire la funzione passando il mouse sopra l'icona di avviso visualizzata 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

dove il flag --inspect indica a Node.js di ascoltare un client di debug. Per saperne di più, consulta la documentazione di Node sul debug.

Tieni presente che utilizzi node_modules/.bin/functions-framework anziché 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 di rosso brillante, a indicare che questa riga di codice è accessibile al 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. Questo evidenziamento indica che questa riga è l'istruzione corrente in fase di valutazione 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 deve 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, avvia di nuovo l'esecuzione della funzione cloud eseguendo il seguente comando 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 e sottoposto a debug una funzione Cloud sulla tua macchina locale, puoi eseguirne il deployment in Google Cloud.

Verifica di utilizzare il progetto creato nel passaggio 2 localmente eseguendo il seguente 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 l'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 verifica che la funzione cloud sia stata di cui è stato eseguito il deployment correttamente verificando la risposta appropriata.

Temperature OK

7. Esegui la pulizia

Per evitare addebiti involontari, ad esempio se questa funzione Cloud viene invocata inavvertitamente più volte rispetto all'allocazione mensile di invocazioni di funzioni Cloud nel livello senza costi, puoi eliminare la funzione Cloud o il progetto 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 modificare i progetti nel tuo Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo il comando 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.
  • Crea e testa una funzione Cloud HTTP in locale.
  • Esegui il debug di una funzione HTTP dalla tua macchina locale.
  • Esegui il deployment di una funzione HTTP dalla tua macchina locale.