Utilizzo di Cloud Functions

Obiettivi

Scrivi, sottoponi a deployment e attiva una funzione Cloud Functions HTTP che accede a Bigtable.

Costi

Questo argomento usa Bigtable e Cloud Functions, i componenti fatturabili di Google Cloud.

  • Per informazioni sul costo dell'utilizzo di Bigtable, consulta i prezzi di Bigtable.

  • Per informazioni sul costo dell'utilizzo di Cloud Functions, incluse le chiamate gratuite, consulta i prezzi di Cloud Functions.

Prima di iniziare

  1. Questo argomento presuppone che tu abbia un'istanza Bigtable denominata test-instance e una tabella denominata test-table. Puoi creare queste risorse seguendo i passaggi descritti in Creazione di una tabella di test. Assicurati di eliminare le risorse al termine per evitare costi inutili.

  2. Abilitare l'API Cloud Functions.

    Abilitare l'API

  3. Installa e inizializza gcloud CLI.

    Se hai già installato gcloud CLI, aggiornalo eseguendo questo comando:

    gcloud components update
    
  4. Prepara l'ambiente di sviluppo:

prepara l'applicazione

  1. Clona il repository dell'app di esempio sulla tua macchina locale:

    Node.js

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

    In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.

    Go

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git

    In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.

  2. Passa alla directory che contiene il codice di esempio di Cloud Functions per accedere a Bigtable:

    Node.js

    cd nodejs-docs-samples/functions/bigtable/

    Python

    cd python-docs-samples/functions/bigtable/

    Go

    cd golang-samples/functions/bigtable/
  3. Dai un'occhiata al codice campione:

    Node.js

    // Imports the Google Cloud client library
    const {Bigtable} = require('@google-cloud/bigtable');
    
    // Instantiates a client
    const bigtable = new Bigtable();
    
    exports.readRows = async (req, res) => {
      // Gets a reference to a Cloud Bigtable instance and database
      const instance = bigtable.instance(req.body.instanceId);
      const table = instance.table(req.body.tableId);
    
      // Execute the query
      try {
        const prefix = 'phone#';
        const rows = [];
        await table
          .createReadStream({
            prefix,
          })
          .on('error', err => {
            res.send(`Error querying Bigtable: ${err}`);
            res.status(500).end();
          })
          .on('data', row => {
            rows.push(
              `rowkey: ${row.id}, ` +
                `os_build: ${row.data['stats_summary']['os_build'][0].value}\n`
            );
          })
          .on('end', () => {
            rows.forEach(r => res.write(r));
            res.status(200).end();
          });
      } catch (err) {
        res.send(`Error querying Bigtable: ${err}`);
        res.status(500).end();
      }
    };
    

    Python

    from google.cloud import bigtable
    from google.cloud.bigtable.row_set import RowSet
    
    client = bigtable.Client()
    
    def bigtable_read_data(request):
        instance = client.instance(request.headers.get("instance_id"))
        table = instance.table(request.headers.get("table_id"))
    
        prefix = "phone#"
        end_key = prefix[:-1] + chr(ord(prefix[-1]) + 1)
    
        outputs = []
        row_set = RowSet()
        row_set.add_row_range_from_keys(prefix.encode("utf-8"), end_key.encode("utf-8"))
    
        rows = table.read_rows(row_set=row_set)
        for row in rows:
            output = "Rowkey: {}, os_build: {}".format(
                row.row_key.decode("utf-8"),
                row.cells["stats_summary"][b"os_build"][0].value.decode("utf-8"),
            )
            outputs.append(output)
    
        return "\n".join(outputs)
    
    

    Go

    
    // Package bigtable contains an example of using Bigtable from a Cloud Function.
    package bigtable
    
    import (
    	"context"
    	"fmt"
    	"log"
    	"net/http"
    	"sync"
    
    	"cloud.google.com/go/bigtable"
    )
    
    // client is a global Bigtable client, to avoid initializing a new client for
    // every request.
    var client *bigtable.Client
    var clientOnce sync.Once
    
    // BigtableRead is an example of reading Bigtable from a Cloud Function.
    func BigtableRead(w http.ResponseWriter, r *http.Request) {
    	clientOnce.Do(func() {
    		// Declare a separate err variable to avoid shadowing client.
    		var err error
    		client, err = bigtable.NewClient(context.Background(), r.Header.Get("projectID"), r.Header.Get("instanceId"))
    		if err != nil {
    			http.Error(w, "Error initializing client", http.StatusInternalServerError)
    			log.Printf("bigtable.NewClient: %v", err)
    			return
    		}
    	})
    
    	tbl := client.Open(r.Header.Get("tableID"))
    	err := tbl.ReadRows(r.Context(), bigtable.PrefixRange("phone#"),
    		func(row bigtable.Row) bool {
    			osBuild := ""
    			for _, col := range row["stats_summary"] {
    				if col.Column == "stats_summary:os_build" {
    					osBuild = string(col.Value)
    				}
    			}
    
    			fmt.Fprintf(w, "Rowkey: %s, os_build:  %s\n", row.Key(), osBuild)
    			return true
    		})
    
    	if err != nil {
    		http.Error(w, "Error reading rows", http.StatusInternalServerError)
    		log.Printf("tbl.ReadRows(): %v", err)
    	}
    }
    

    La funzione invia una richiesta di lettura alla tabella per recuperare tutti i dati stats_summary per le righe con un prefisso della chiave di riga di phone. La funzione viene eseguita quando invii una richiesta HTTP all'endpoint della funzione.

Esegui il deployment della funzione

Per eseguire il deployment della funzione con un trigger HTTP, esegui questo comando nella directory bigtable:

Node.js

gcloud functions deploy get \
--runtime nodejs20 --trigger-http

Utilizza il flag --runtime per specificare l'ID runtime di una versione di Node.js supportata per eseguire la funzione.

Python

gcloud functions deploy bigtable_read_data \
--runtime python312 --trigger-http

Utilizza il flag --runtime per specificare l'ID runtime di una versione Python supportata per eseguire la funzione.

Go

gcloud functions deploy BigtableRead \
--runtime go121 --trigger-http

Utilizza il flag --runtime per specificare l'ID runtime di una versione Go supportata per eseguire la funzione.

Il deployment delle funzioni può richiedere fino a due minuti.

Al termine del deployment, la funzione restituisce il valore url. Dovrai utilizzare questo valore quando attivi la funzione.

Puoi visualizzare le funzioni di cui hai eseguito il deployment nella pagina Cloud Functions della console Google Cloud. Puoi anche creare e modificare le funzioni in questa pagina e ottenere dettagli e diagnostica per le funzioni.

Attiva la funzione

Esegui una richiesta HTTP alla funzione:

Node.js

curl "https://REGION-PROJECT_ID.cloudfunctions.net/get" -H "instance_id: test-instance" -H "table_id: test-table"

Python

curl "https://REGION-PROJECT_ID.cloudfunctions.net/bigtable_read_data" -H "instance_id: test-instance" -H "table_id: test-table"

Go

curl "https://REGION-PROJECT_ID.cloudfunctions.net/BigtableRead" -H "instance_id: test-instance" -H "table_id: test-table"

dove REGION e PROJECT_ID corrispondono ai valori visibili nel terminale al termine del deployment della funzione. Dovresti vedere un output che mostra i risultati della richiesta di lettura.

Puoi anche visitare l'URL della funzione nel browser per vedere il risultato della richiesta di lettura.

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi aggiuntivi per le risorse Bigtable e Cloud Functions utilizzate in questo argomento:

  1. Elimina l'istanza:

    gcloud bigtable instances delete test-instance
    
  2. Elimina la funzione di cui hai eseguito il deployment:

    Node.js

    gcloud functions delete get 

    Python

    gcloud functions delete bigtable_read_data 

    Go

    gcloud functions delete BigtableRead 

Passaggi successivi