Crea una función que muestre resultados de BigQuery

En este instructivo, se muestra cómo escribir una función de Cloud Run HTTP que envía una consulta a BigQuery.

Antes de comenzar

  1. Asegúrate de haber configurado un proyecto nuevo para Cloud Run, como se describe en la página de configuración.

  2. Habilita las APIs de Artifact Registry, Cloud Build y Cloud Run Admin:

     gcloud services enable artifactregistry.googleapis.com \
         cloudbuild.googleapis.com \
         run.googleapis.com
    
  3. Si estás bajo una política de la organización de restricción de dominios que restringe las invocaciones no autenticadas para tu proyecto, deberás acceder al servicio implementado como se describe en Prueba servicios privados.

Roles obligatorios

Para obtener los permisos que necesitas para implementar los servicios de Cloud Run desde la fuente, pídele a tu administrador que te otorgue los siguientes roles de IAM:

Para obtener una lista de los roles y los permisos de IAM asociados con Cloud Run, consulta los roles de IAM de Cloud Run y los permisos de IAM de Cloud Run. Si tu servicio de Cloud Run interactúa con las APIs deGoogle Cloud , como las bibliotecas cliente de Cloud, consulta la guía de configuración de identidades del servicio. Para obtener más información sobre cómo otorgar roles, consulta permisos de implementación y administra el acceso.

Roles de la cuenta de servicio

  • Para que Cloud Build pueda compilar tus fuentes, otorga el rol de cuenta de servicio de Cloud Build a la cuenta de servicio predeterminada de Compute Engine mediante la ejecución de lo siguiente:

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

    Reemplaza PROJECT_NUMBER por el número de proyecto de Google Cloud y PROJECT_ID por el ID del proyecto de Google Cloud. Para obtener instrucciones detalladas sobre cómo encontrar el ID y el número de tu proyecto, consulta Crea y administra proyectos.

    El otorgamiento del rol de cuenta de servicio de Cloud Build a la cuenta de servicio predeterminada de Compute Engine tarda un par de minutos en propagarse.

  • Prepara la aplicación

    1. Clona el repositorio de la aplicación de muestra en tu máquina local:

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

      Como alternativa, descarga la muestra como un archivo ZIP y extráela.

    2. Dirígete al directorio que contiene el código de muestra:

      cd nodejs-docs-samples/functions/v2/helloBigQuery
      
    3. Ve el código de muestra. La muestra envía una consulta de palabras que ocurren al menos 400 veces en el conjunto de datos especificado y muestra el 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}`);
        }
      });

    Implementa la función

    Para implementar la función con un activador HTTP, haz lo siguiente:

    1. Ejecuta el siguiente comando en el directorio que contiene el código de muestra:

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

      Reemplaza lo siguiente:

      • Reemplaza FUNCTION por el nombre de la función que vas a implementar, por ejemplo, my-bigquery-function. Puedes omitir este parámetro por completo, pero se te solicitará el nombre si lo haces.

      • FUNCTION_ENTRYPOINT por el punto de entrada a tu función en tu código fuente. Este es el código que ejecuta Cloud Run cuando se ejecuta tu función. El valor de esta marca debe ser un nombre de función o un nombre de clase completamente calificado que exista en tu código fuente. El punto de entrada que debes especificar para la función de ejemplo es helloBigQuery.

      • BASE_IMAGE por el entorno de imagen base de tu función, por ejemplo, nodejs22. Para obtener detalles sobre las imágenes base y los paquetes incluidos en cada una, consulta Imágenes base de los entornos de ejecución.

      • REGION por la región de Google Clouden la que deseas implementar tu función. Por ejemplo, us-central1.

      Opcional:

      • Si creas una función de HTTP pública, por ejemplo, un webhook, especifica la marca --allow-unauthenticated. Esta marca asigna el rol de invocador de IAM de Cloud Run al identificador especial allUser. Puedes usar IAM para editar esta configuración más adelante una vez que hayas creado el servicio.

    Prueba la función

    1. Cuando la función termine de implementarse, copia la propiedad uri.

    2. Visita este URI en tu navegador.

      Deberías ver una lista de las palabras que coinciden con los criterios de la consulta y cuántas veces aparece cada palabra en el conjunto de datos de destino.

    Limpia

    Si bien Cloud Run no cobra cuando el servicio no se usa, es posible que se te cobre por el almacenamiento de la imagen de contenedor en Artifact Registry. Puedes borrar la imagen de contenedor o borrar el proyecto de Google Cloud para evitar que se apliquen cargos. Si borras tu proyecto de Google Cloud , se detendrá la facturación de todos los recursos que se usen en ese proyecto.

    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.