Crie uma função do Cloud Run que devolva resultados do Spanner

Este tutorial mostra como escrever uma função HTTP do Cloud Run que devolve resultados do Spanner.

Objetivos

Escrever, implementar e acionar uma função HTTP que aceda ao Spanner.

Custos

Este documento usa o Spanner e o Cloud Run, que são componentes faturáveis do Google Cloud.

  • Para obter informações sobre o custo de utilização do Spanner, consulte os preços do Spanner.

  • Para obter informações sobre o custo de utilização do Cloud Run, incluindo invocações gratuitas, consulte os preços do Cloud Run.

Antes de começar

  1. Este documento pressupõe que tem uma instância do Spanner com o nome test-instance e uma base de dados com o nome example-db que usa o esquema da aplicação de música. Para obter instruções sobre como criar uma instância e uma base de dados com o esquema da aplicação de música, consulte o guia de início rápido com a consola ou os tutoriais de introdução em Node.js ou Python.

  2. Ative as APIs Cloud Run e Cloud Build.

    Ative as APIs

  3. Instale e inicialize a CLI gcloud.

    Se já tiver a CLI gcloud instalada, atualize-a executando o seguinte comando:

    gcloud components update
    
  4. Prepare o ambiente de programação:

Prepare a aplicação

  1. Clone o repositório da app de exemplo para a sua máquina local:

    Node.js

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

    Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.

    Python

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

    Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.

  2. Altere para o diretório que contém o código de exemplo das funções do Cloud Run para aceder ao Spanner:

    Node.js

    cd nodejs-docs-samples/functions/spanner

    Python

    cd python-docs-samples/functions/spanner
  3. Veja o exemplo de código:

    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)
    
    

    A função envia uma consulta SQL para obter todos os dados do Albums da sua base de dados. A função é executada quando faz um pedido HTTP ao ponto final da função.

Implemente a função

Para implementar a função com um acionador HTTP, execute o seguinte comando no diretório 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

Substituir:

A implementação da função pode demorar até dois minutos.

Tenha em atenção o valor url devolvido quando a implementação da função terminar. Vai usá-lo quando acionar a função.

Pode ver as suas funções implementadas na página Cloud Run naGoogle Cloud consola. Também pode criar e editar funções nessa página, bem como obter detalhes e diagnósticos para as suas funções.

Acionar a função

Efetue um pedido HTTP à sua função:

curl URL

Substitua URL pelo valor do URL devolvido quando a implementação da função terminar.

Deverá ver um resultado que mostra os resultados da consulta SQL, partindo do princípio de que seguiu um tutorial de introdução e preencheu a base de dados:

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

Também pode visitar o URL da função no navegador para ver o resultado da sua consulta SQL.

Limpar

Para evitar incorrer em custos adicionais na sua Google Cloud conta pelas funções do Spanner e do Cloud Run usadas neste documento:

  1. Elimine a instância:

    gcloud CLI instances delete test-instance
    
  2. Elimine o serviço do Cloud Run que implementou neste tutorial:

    Node.js

    gcloud run services delete nodejs-spanner-function

    Python

    gcloud run services delete python-spanner-function

O que se segue?