Crea una funzione Cloud Run 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 la pagina Prezzi di Spanner.

  • Per informazioni sul costo di utilizzo di Cloud Run, incluse le invocazioni gratuite, consulta Prezzi di Cloud Run.

Prima di iniziare

  1. Questo documento presuppone che tu abbia un'istanza Spanner denominata test-instance e 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 all'utilizzo della console o i tutorial per iniziare a utilizzare Node.js o Python.

  2. Abilita le API Cloud Run e Cloud Build.

    Abilita le API

  3. Installa e inizializza la gcloud CLI.

    Se hai già installato gcloud CLI, aggiornalo eseguendo il seguente 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 il sample come file ZIP ed estrarlo.

    Python

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

    In alternativa, puoi scaricare il sample come file ZIP ed estrarlo.

  2. Passa alla directory che contiene il codice di esempio delle funzioni Cloud Run 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 di esempio:

    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 invii 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 userai quando attiverai la funzione.

Puoi visualizzare le funzioni di cui è stato eseguito il deployment nella pagina Cloud Run della console Google Cloud. In questa pagina puoi anche creare e modificare le funzioni, nonché visualizzarne dettagli e diagnostica.

Attiva la funzione

Invia una richiesta HTTP alla funzione:

curl URL

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

Dovresti vedere un output che mostra i risultati della query SQL, supponendo che tu abbia completato un tutorial introduttivo e compilato 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 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