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
- 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)
- Completare la guida La mia prima funzione: 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 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.
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.
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 eseguire la funzione passando il mouse sopra l'icona di avviso visualizzata 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
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.
L'icona del punto di interruzione dovrebbe illuminarsi di rosso brillante, a indicare che questa riga di codice è accessibile al 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. Questo evidenziamento indica che questa riga è l'istruzione corrente in fase di valutazione 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 deve 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, 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 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 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.
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.