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

Este tutorial mostra-lhe como escrever uma função HTTP do Cloud Run que envia uma consulta para o BigQuery.

Antes de começar

  1. Certifique-se de que configurou um novo projeto para o Cloud Run, conforme descrito na página de configuração.

  2. Ative as APIs Artifact Registry, Cloud Build e Cloud Run Admin API:

     gcloud services enable artifactregistry.googleapis.com \
         cloudbuild.googleapis.com \
         run.googleapis.com
    
  3. Se estiver ao abrigo de uma política da organização de restrição de domínio que restringe as invocações não autenticadas para o seu projeto, tem de aceder ao serviço implementado conforme descrito em Testar serviços privados.

Funções necessárias

Para receber as autorizações de que precisa para implementar serviços do Cloud Run a partir da origem, peça ao administrador para lhe conceder as seguintes funções de IAM:

Para ver uma lista de funções e autorizações de IAM associadas ao Cloud Run, consulte os artigos Funções de IAM do Cloud Run e Autorizações de IAM do Cloud Run. Se o seu serviço do Cloud Run interage com Google Cloud APIs, como as bibliotecas cliente da Google Cloud, consulte o guia de configuração da identidade do serviço. Para mais informações sobre a atribuição de funções, consulte as autorizações de implementação e faça a gestão do acesso.

Funções da conta de serviço do Cloud Build

O utilizador ou o administrador tem de conceder à conta de serviço do Cloud Build a seguinte função do IAM.

Clique para ver as funções necessárias para a conta de serviço do Cloud Build

O Cloud Build usa automaticamente a conta de serviço predefinida do Compute Engine como a conta de serviço predefinida do Cloud Build para compilar o seu código-fonte e o recurso do Cloud Run, a menos que substitua este comportamento. Para que o Cloud Build compile as suas origens, peça ao administrador para conceder a função Cloud Run Builder (roles/run.builder) à conta de serviço predefinida do Compute Engine no seu projeto:

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

Substitua PROJECT_NUMBER pelo seu Google Cloud número do projeto e PROJECT_ID pelo seu Google Cloud ID do projeto. Para ver instruções detalhadas sobre como encontrar o ID e o número do projeto, consulte o artigo Criar e gerir projetos.

A concessão da função de criador do Cloud Run à conta de serviço predefinida do Compute Engine demora alguns minutos a propagar.

Prepare a aplicação

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

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

    Em alternativa, transfira o exemplo como um ficheiro ZIP e extraia-o.

  2. Altere para o diretório que contém o código de exemplo:

    cd nodejs-docs-samples/functions/v2/helloBigQuery
    
  3. Veja o exemplo de código. O exemplo envia uma consulta para palavras que ocorrem, pelo menos, 400 vezes no conjunto de dados especificado e devolve o resultado.

    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    const functions = require('@google-cloud/functions-framework');
    
    /**
     * HTTP Cloud Function that returns BigQuery query results
     *
     * @param {Object} req Cloud Function request context.
     * @param {Object} res Cloud Function response context.
     */
    functions.http('helloBigQuery', async (req, res) => {
      // Define the SQL query
      // Queries the public Shakespeare dataset using named query parameter
      const sqlQuery = `
          SELECT word, word_count
                FROM \`bigquery-public-data.samples.shakespeare\`
                WHERE corpus = @corpus
                AND word_count >= @min_word_count
                ORDER BY word_count DESC`;
    
      const options = {
        query: sqlQuery,
        // Location must match that of the dataset(s) referenced in the query.
        location: 'US',
        params: {corpus: 'romeoandjuliet', min_word_count: 400},
      };
    
      // Execute the query
      try {
        const [rows] = await bigquery.query(options);
        // Send the results
        res.status(200).send(rows);
      } catch (err) {
        console.error(err);
        res.status(500).send(`Error querying BigQuery: ${err}`);
      }
    });

Implemente a função

Para implementar a função com um acionador HTTP:

  1. Execute o seguinte comando no diretório que contém o código de exemplo:

    gcloud run deploy FUNCTION \
       --source . \
       --function FUNCTION_ENTRYPOINT \
       --base-image BASE_IMAGE \
       --region REGION \
       --allow-unauthenticated

    Substituir:

    • FUNCTION com o nome da função que está a implementar, por exemplo, my-bigquery-function. Pode omitir este parâmetro por completo, mas é-lhe pedido o nome se o omitir.

    • FUNCTION_ENTRYPOINT com o ponto de entrada da sua função no código-fonte. Este é o código que o Cloud Run executa quando a sua função é executada. O valor desta flag tem de ser um nome de função ou um nome de classe totalmente qualificado que exista no seu código-fonte. O ponto de entrada que tem de especificar para a função de exemplo é helloBigQuery.

    • BASE_IMAGE com o ambiente de imagem base para a sua função, por exemplo, nodejs22. Para ver detalhes sobre as imagens base e os pacotes incluídos em cada imagem, consulte o artigo Imagens base de tempos de execução.

    • REGION com a Google Cloud região onde quer implementar a sua função. Por exemplo, europe-west1.

    Opcional:

    • Se estiver a criar uma função HTTP pública, por exemplo, um webhook, especifique a flag --allow-unauthenticated. Esta flag atribui a função de invocador da IAM do Cloud Run ao identificador especial allUser. Pode usar o IAM para editar esta definição mais tarde, depois de criar o serviço.

Teste a função

  1. Quando a implementação da função terminar, copie a propriedade uri.

  2. Visite este URI no seu navegador.

    Deve ver uma lista das palavras que correspondem aos critérios da consulta e quantas vezes cada palavra aparece no conjunto de dados de destino.

Limpar

Embora o Cloud Run não cobre quando o serviço não está em utilização, ainda pode ser-lhe cobrado o armazenamento da imagem do contentor no Artifact Registry. Pode eliminar a imagem do contentor ou eliminar o Google Cloud projeto para evitar incorrer em custos. A eliminação do seu Google Cloud projeto interrompe a faturação de todos os recursos usados nesse projeto.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.