Crea una funzione Cloud Run che restituisce i risultati di Spanner

Questo tutorial mostra come scrivere una funzione Cloud Run HTTP che restituisce i risultati di Spanner.

Obiettivi

Scrivi, esegui il deployment e attiva una funzione HTTP che accede a Spanner.

Costi

Questo documento utilizza Spanner e Cloud Run, che sono componenti fatturabili di Google Cloud.

  • Per informazioni sul costo dell'utilizzo di Spanner, consulta Prezzi di Spanner.

  • Per informazioni sul costo dell'utilizzo di Cloud Run, incluse le chiamate senza costi, consulta Prezzi di Cloud Run.

Prima di iniziare

  1. Questo documento presuppone che tu disponga di un'istanza Spanner denominata test-instance e di un database denominato example-db che utilizza lo schema dell'applicazione musicale. Per istruzioni su come creare un'istanza e un database con lo schema dell'applicazione musicale, consulta la guida rapida sull'uso della console o i tutorial per iniziare a usare Node.js o Python.

  2. Abilita le API Cloud Run e Cloud Build.

    Abilita le API

  3. Installa e inizializza gcloud CLI.

    Se hai già installato gcloud CLI, aggiornala eseguendo il seguente comando:

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

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per eseguire il deployment dei servizi Cloud Run dall'origine, chiedi all'amministratore di concederti i seguenti ruoli IAM:

Per un elenco di ruoli e autorizzazioni IAM associati a Cloud Run, consulta Ruoli IAM di Cloud Run e Autorizzazioni IAM di Cloud Run. Se il tuo servizio Cloud Run interagisce con le APIGoogle Cloud , come le librerie client Cloud, consulta la guida alla configurazione dell'identità del servizio. Per saperne di più sulla concessione dei ruoli, consulta Autorizzazioni di deployment e Gestisci l'accesso.

Ruoli per il account di servizio Cloud Build

Tu o il tuo amministratore dovete concedere all'account di servizio Cloud Build il seguente ruolo IAM.

Fai clic per visualizzare i ruoli richiesti per il account di servizio Cloud Build

Cloud Build utilizza automaticamente l'account di servizio predefinito di Compute Engine come service account Cloud Build predefinito per creare il codice sorgente e la risorsa Cloud Run, a meno che tu non esegua l'override di questo comportamento. Per consentire a Cloud Build di creare le tue origini, chiedi all'amministratore di concedere il ruolo Cloud Run Builder (roles/run.builder) al account di servizio Compute Engine predefinito nel tuo progetto:

  gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.builder
  

Sostituisci PROJECT_NUMBER con il numero del tuo progetto Google Cloude PROJECT_ID con l'ID progetto Google Cloud. Per istruzioni dettagliate su come trovare l'ID progetto e il numero di progetto, vedi Creazione e gestione dei progetti.

La concessione del ruolo Cloud Run Builder al account di servizio Compute Engine predefinito richiede alcuni minuti per la propagazione.

Ruoli per l'identità del servizio

Devi concedere all'identità di servizio che utilizzi per il servizio Cloud Run il seguente ruolo IAM.

  • Lettore database Spanner (roles/spanner.databaseReader)

Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

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.

  2. Passa alla directory che contiene il codice campione di Cloud Run Functions per accedere a Spanner:

    Node.js

    cd nodejs-docs-samples/functions/spanner

    Python

    cd python-docs-samples/functions/spanner
  3. Dai un'occhiata al codice campione:

    Node.js

    // Imports the Google Cloud client library
    const {Spanner} = require('@google-cloud/spanner');
    
    // Imports the functions framework to register your HTTP function
    const functions = require('@google-cloud/functions-framework');
    
    // Instantiates a client
    const spanner = new Spanner();
    
    // Your Cloud Spanner instance ID
    const instanceId = 'test-instance';
    
    // Your Cloud Spanner database ID
    const databaseId = 'example-db';
    
    /**
     * HTTP Cloud Function.
     *
     * @param {Object} req Cloud Function request context.
     * @param {Object} res Cloud Function response context.
     */
    functions.http('spannerQuickstart', async (req, res) => {
      // Gets a reference to a Cloud Spanner instance and database
      const instance = spanner.instance(instanceId);
      const database = instance.database(databaseId);
    
      // The query to execute
      const query = {
        sql: 'SELECT * FROM Albums',
      };
    
      // Execute the query
      try {
        const results = await database.run(query);
        const rows = results[0].map(row => row.toJSON());
        rows.forEach(row => {
          res.write(
            `SingerId: ${row.SingerId}, ` +
              `AlbumId: ${row.AlbumId}, ` +
              `AlbumTitle: ${row.AlbumTitle}\n`
          );
        });
        res.status(200).end();
      } catch (err) {
        res.status(500).send(`Error querying Spanner: ${err}`);
      }
    });

    Python

    import functions_framework
    from google.cloud import spanner
    
    instance_id = "test-instance"
    database_id = "example-db"
    
    client = spanner.Client()
    instance = client.instance(instance_id)
    database = instance.database(database_id)
    
    
    @functions_framework.http
    def spanner_read_data(request):
        query = "SELECT * FROM Albums"
    
        outputs = []
        with database.snapshot() as snapshot:
            results = snapshot.execute_sql(query)
    
            for row in results:
                output = "SingerId: {}, AlbumId: {}, AlbumTitle: {}".format(*row)
                outputs.append(output)
    
        return "\n".join(outputs)
    
    

    La funzione invia una query SQL per recuperare tutti i dati Albums dal database. La funzione viene eseguita quando effettui una richiesta HTTP all'endpoint della funzione.

esegui il deployment della funzione

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

Node.js

gcloud run deploy nodejs-spanner-function \
    --source . \
    --region REGION \
    --function spannerQuickstart \
    --base-image RUNTIME_ID \
    --log-http

Python

gcloud run deploy python-spanner-function \
    --source . \
    --region REGION \
    --function spanner_read_data \
    --base-image RUNTIME_ID \
    --log-http

Sostituisci:

Il deployment della funzione potrebbe richiedere fino a due minuti.

Prendi nota del valore url restituito al termine del deployment della funzione. Lo utilizzerai quando attivi la funzione.

Puoi visualizzare le funzioni di cui è stato eseguito il deployment nella pagina Cloud Run nella console Google Cloud . Puoi anche creare e modificare le funzioni in questa pagina e ottenere dettagli e diagnostica per le tue funzioni.

Attiva la funzione

Invia una richiesta HTTP alla funzione:

curl URL

Sostituisci URL con il valore URL restituito al termine del deployment della funzione.

Dovresti vedere un output che mostra i risultati della query SQL, supponendo che tu abbia seguito un tutorial introduttivo e popolato il database:

SingerId: 2, AlbumId: 2, AlbumTitle: Forever Hold Your Peace
SingerId: 1, AlbumId: 2, AlbumTitle: Go, Go, Go
SingerId: 2, AlbumId: 1, AlbumTitle: Green
SingerId: 2, AlbumId: 3, AlbumTitle: Terrified
SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk

Puoi anche visitare l'URL della funzione nel browser per visualizzare il risultato della query SQL.

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi aggiuntivi per le risorse di Spanner e Cloud Run Functions utilizzate in questo documento:

  1. Elimina l'istanza:

    gcloud CLI instances delete test-instance
    
  2. Elimina il servizio Cloud Run di cui hai eseguito il deployment in questo tutorial:

    Node.js

    gcloud run services delete nodejs-spanner-function

    Python

    gcloud run services delete python-spanner-function

Passaggi successivi