Crear una función de Cloud Run que devuelva resultados de Spanner

En este tutorial se muestra cómo escribir una función HTTP de Cloud Run que devuelva resultados de Spanner.

Objetivos

Escribe, despliega y activa una función HTTP que acceda a Spanner.

Costes

En este documento se usan Spanner y Cloud Run, que son componentes facturables de Google Cloud.

  • Para obtener información sobre el coste de usar Spanner, consulta la página Precios de Spanner.

  • Para obtener información sobre el coste de usar Cloud Run, incluidas las invocaciones gratuitas, consulta los precios de Cloud Run.

Antes de empezar

  1. En este documento se da por hecho que tienes una instancia de Spanner llamada test-instance y una base de datos llamada example-db que usa el esquema de la aplicación de música. Para obtener instrucciones sobre cómo crear una instancia y una base de datos con el esquema de la aplicación de música, consulta la guía de inicio rápido para usar la consola o los tutoriales de introducción de Node.js o Python.

  2. Habilita las APIs Cloud Run y Cloud Build.

    Habilitar las APIs

  3. Instala e inicializa gcloud CLI.

    Si ya tienes instalada la CLI de gcloud, actualízala ejecutando el siguiente comando:

    gcloud components update
    
  4. Prepara tu entorno de desarrollo:

Preparar la aplicación

  1. Clona el repositorio de aplicaciones de muestra en la máquina local:

    Node.js

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

    También puedes descargar la muestra como un archivo ZIP y extraerla.

    Python

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

    También puedes descargar la muestra como un archivo ZIP y extraerla.

  2. Cambia al directorio que contiene el código de ejemplo de las funciones de Cloud Run para acceder a Spanner:

    Node.js

    cd nodejs-docs-samples/functions/spanner

    Python

    cd python-docs-samples/functions/spanner
  3. Echa un vistazo al código de ejemplo:

    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 función envía una consulta SQL para obtener todos los datos de Albums de tu base de datos. La función se ejecuta cuando haces una solicitud HTTP al endpoint de la función.

Desplegar la función

Para desplegar la función con un activador HTTP, ejecuta el siguiente comando en el directorio 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

Sustituye:

El despliegue de la función puede tardar hasta dos minutos.

Anota el valor de url que se devuelve cuando finaliza la implementación de la función. La usarás cuando actives la función.

Puedes ver las funciones implementadas en la página Cloud Run de laGoogle Cloud consola. También puedes crear y editar funciones en esa página, así como obtener detalles y diagnósticos de tus funciones.

Activar la función

Envía una solicitud HTTP a tu función:

curl URL

Sustituye URL por el valor de la URL que se devuelve cuando finaliza la implementación de la función.

Deberías ver un resultado que muestre los resultados de la consulta de SQL, siempre que hayas completado un tutorial de introducción y hayas rellenado la base de datos:

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

También puedes visitar la URL de la función en tu navegador para ver el resultado de tu consulta SQL.

Limpieza

Para evitar que se apliquen cargos adicionales a tu Google Cloud cuenta por los recursos de funciones de Spanner y Cloud Run utilizados en este documento, haz lo siguiente:

  1. Elimina la instancia:

    gcloud CLI instances delete test-instance
    
  2. Elimina el servicio de Cloud Run que has desplegado en este tutorial:

    Node.js

    gcloud run services delete nodejs-spanner-function

    Python

    gcloud run services delete python-spanner-function

Siguientes pasos