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
- Cloud SDK
- Visual Studio Code
- Node.js 8.6.0 o versioni successive (per installare Node.js, utilizza nvm; per controllare la versione, esegui node –version)
- Completamento della guida My First Function: Node.js
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.
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.
Per questo codelab, scegli Only With Flag
come mostrato nell'immagine di seguito:
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
.
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.
L'icona del punto di interruzione dovrebbe illuminarsi in rosso per indicare che questa riga di codice è accessibile dal debugger.
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.
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.
Fai clic sull'icona di ignoramento per eseguire l'istruzione successiva.
Vedrai che l'istruzione corrente passa alla parte else dell'istruzione if.
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.
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 nomevalidateTemperature
e un punto di contatto denominatovalidateTemperature
--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.
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.