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

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

Antes de empezar

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

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

     gcloud services enable artifactregistry.googleapis.com \
         cloudbuild.googleapis.com \
         run.googleapis.com
    
  3. Si tu proyecto está sujeto a una política de organización de restricción de dominio que restringe las invocaciones no autenticadas, tendrás que acceder al servicio desplegado tal como se describe en la sección Probar servicios privados.

Roles obligatorios

Para obtener los permisos que necesitas para desplegar servicios de Cloud Run desde el código fuente, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos:

Para ver una lista de los roles y permisos de gestión de identidades y accesos asociados a Cloud Run, consulta los artículos sobre roles de gestión de identidades y accesos de Cloud Run y permisos de gestión de identidades y accesos de Cloud Run. Si tu servicio de Cloud Run interactúa con APIs, como las bibliotecas de cliente de Cloud, consulta la guía de configuración de la identidad del servicio.Google Cloud Para obtener más información sobre cómo conceder roles, consulta los artículos sobre permisos de implementación y gestión del acceso.

Roles de la cuenta de servicio de Cloud Build

Tú o tu administrador debéis conceder el siguiente rol de gestión de identidades y accesos a la cuenta de servicio de Cloud Build.

Haz clic para ver los roles necesarios de la cuenta de servicio de Cloud Build

Cloud Build usa automáticamente la cuenta de servicio predeterminada de Compute Engine como cuenta de servicio predeterminada de Cloud Build para compilar tu código fuente y tu recurso de Cloud Run, a menos que anules este comportamiento. Para que Cloud Build compile tus fuentes, pide a tu administrador que conceda el rol Compilador de Cloud Run (roles/run.builder) a la cuenta de servicio predeterminada de Compute Engine de tu proyecto:

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

Sustituye PROJECT_NUMBER por el número de tu proyecto Google Cloud y PROJECT_ID por el ID de tu proyecto Google Cloud. Para obtener instrucciones detalladas sobre cómo encontrar el ID y el número de tu proyecto, consulta el artículo Crear y gestionar proyectos.

La concesión del rol de compilador de Cloud Run a la cuenta de servicio predeterminada de Compute Engine tarda un par de minutos en propagarse.

Preparar 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
    

    También puedes descargar el archivo de muestra como archivo zip y extraerlo.

  2. Accede al directorio que contiene el código de muestra:

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

Desplegar la función

Para desplegar la función con un activador HTTP, sigue estos pasos:

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

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

    Sustituye:

    • FUNCTION con 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 pedirá el nombre si lo haces.

    • FUNCTION_ENTRYPOINT con el punto de entrada de tu función en el 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 completo que exista en el código fuente. El punto de entrada que debes especificar para la función de ejemplo es helloBigQuery.

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

    • REGION por la Google Cloud región en la que quieras desplegar tu función. Por ejemplo, europe-west1.

    Optional:

    • Si vas a crear una función HTTP pública (por ejemplo, un webhook), especifica la marca --allow-unauthenticated. Esta marca asigna el rol de invocador de gestión de identidades y accesos de Cloud Run al identificador especial allUser. Puedes usar la gestión de identidades y accesos para editar esta opción más adelante, después de crear el servicio.

Probar función

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

  2. Visita este URI en tu navegador.

    Verás una lista de las palabras que coinciden con los criterios de la consulta y el número de veces que aparece cada palabra en el conjunto de datos de destino.

Limpieza

Aunque Cloud Run no aplica cargos cuando el servicio no se está usando, es posible que se te cobre por almacenar la imagen de contenedor en Artifact Registry. Puede eliminar su imagen de contenedor o su proyecto Google Cloud para evitar que se le apliquen cargos. Al eliminar tu Google Cloud proyecto, se detendrá la facturación de todos los recursos utilizados 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.