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

1. Panoramica

Google Cloud Functions è una piattaforma di computing 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 scritte in JavaScript vengono eseguite in un ambiente Node.js su Google Cloud Platform. 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 Functions per Node.js che indica se una temperatura specificata è accettabile o troppo calda. Creerai, testerai ed eseguirai il debug della tua Cloud Function utilizzando Visual Studio Code sulla tua macchina locale. Infine, eseguirai il deployment della funzione su Google Cloud Platform.

Cosa imparerai a fare

  • Framework di Functions per Node.js.
  • Crea e testa una funzione Cloud Functions HTTP in locale.
  • Esegui il debug di una funzione HTTP dalla macchina locale.
  • Esegui il deployment di una funzione HTTP dalla tua macchina locale.

2. Configurazione e requisiti

Prerequisiti

Costi

Sebbene questo codelab richieda solo una chiamata 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 di Google possano essere utilizzate senza costi, l'utilizzo di Google Cloud Platform (ovvero dei suoi prodotti e API) non è senza costi. Per utilizzare Cloud Functions, devi disporre di un account di fatturazione attivo. Tieni presente che alcuni prodotti Google Cloud Platform (GCP) includono un livello"Always Free" che devi superare per incorrere nella fatturazione. Ai fini del codelab, ogni chiamata di Cloud Functions viene conteggiata ai fini del livello senza costi. Se rispetti i limiti complessivi (entro ogni mese), non dovresti incorrere in addebiti.

3. Installa il framework di Functions per Node.js

Il framework di Functions per Node.js è un framework FaaS (Function as a Service) open source per scrivere funzioni Node.js portatili, creato 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

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

Ora installa Functions Framework per Node.js.

npm install @google-cloud/functions-framework

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

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

Functions Framework è stato installato correttamente. Ora puoi creare la tua funzione Cloud Functions.

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

Crea 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 puoi testare la funzione.

Funzione di test 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 l'output seguente:

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

Crea una seconda finestra del terminale all'interno di 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 pubblicare 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 gestendo una funzione, l'elenco a discesa la indica come node. In caso contrario, viene chiamato zsh (o la shell che stai utilizzando).

Nella seconda finestra del terminale, esegui questo 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 alta" 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 gestisce.

5. Esegui 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 nella tavolozza dei comandi e seleziona il primo elemento dell'elenco.

601e542b4ec9f6f9.png

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

b9e6b762d150e62b.png

Ora ricarica la finestra del terminale che hai utilizzato in VS Code per pubblicare 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 nuovamente il framework di Functions 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 stai utilizzando node_modules/.bin/functions-framework anziché node_modules/@google-cloud/functions-framework. Per utilizzare la modalità di ispezione, devi utilizzare l'eseguibile collegato simbolicamente automaticamente 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 alla riga 3 facendo clic all'interno del margine a sinistra del numero di riga.

2fbb4d5916e1dbfa.png

L'icona del punto di interruzione deve illuminarsi di rosso vivo, indicando 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 

Vedrai una evidenziazione gialla sulla riga 3. Questo evidenziazione indica che questa riga è l'istruzione corrente in fase di valutazione da parte del debugger.

206c7ed1eb189e90.png

Passa il mouse sopra la variabile temp per verificare che il suo contenuto sia undefined, poiché la richiesta non ha fornito un payload di temperatura.

97979025f4bf2842.png

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

Vedrai l'istruzione corrente passare alla parte else dell'istruzione if.

cf0e8ce7e0388f98.png

Per questa demo, puoi supporre 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 Disconnetti per disconnettere il debugger.

1070d059775ad769.png

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

Aggiorna la funzione per aggiungere 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 generata un'eccezione eseguendo questo 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 su Google Cloud.

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

gcloud config get-value project

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

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

In una finestra del terminale, esegui questo comando:

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

dove i parametri sono spiegati come segue:

  • deploy validateTemperature: il comando secondario gcloud per il deployment di una funzione Cloud Functions con il nome validateTemperature con un punto di ingresso denominato validateTemperature
  • --trigger-http: il tipo di evento di trigger
  • --runtime nodejs12: il runtime di destinazione 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 

Una volta completato il deployment, nell'output verrà 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 il deployment della funzione cloud sia stato eseguito correttamente controllando la risposta appropriata.

Temperature OK

7. Esegui la pulizia

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

Per eliminare la funzione Cloud, vai alla console Cloud di Cloud Functions all'indirizzo https://console.cloud.google.com/functions/. Assicurati che il progetto che hai creato nel passaggio 2 sia il progetto 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 che hai creato nel passaggio 2 e scegliere Elimina. Se elimini il progetto, dovrai cambiare progetto in Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list.

8. Complimenti!

Congratulazioni per aver completato il codelab. Puoi scoprire 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 Functions HTTP in locale.
  • Esegui il debug di una funzione HTTP dalla macchina locale.
  • Esegui il deployment di una funzione HTTP dalla tua macchina locale.