Crear un flujo de procesamiento de BigQuery con Eventarc


En este tutorial se explica cómo usar Eventarc para crear una canalización de procesamiento que programe consultas en un conjunto de datos público de BigQuery, genere gráficos basados en los datos y comparta enlaces a los gráficos por correo electrónico.

Objetivos

En este tutorial, crearás y desplegarás tres servicios de Cloud Run que permiten el acceso sin autenticar y que reciben eventos mediante Eventarc:

  1. Query Runner: se activa cuando las tareas de Cloud Scheduler publican un mensaje en un tema de Pub/Sub. Este servicio usa la API de BigQuery para recuperar datos de un conjunto de datos público sobre la COVID-19 y guarda los resultados en una tabla de BigQuery.
  2. Creador de gráficos: se activa cuando el servicio Query Runner publica un mensaje en un tema de Pub/Sub. Este servicio genera gráficos con la biblioteca de trazado de Python Matplotlib y los guarda en un bucket de Cloud Storage.
  3. Notificador: se activa mediante registros de auditoría cuando el servicio Chart Creator almacena un gráfico en un segmento de Cloud Storage. Este servicio usa el servicio de correo electrónico SendGrid para enviar enlaces a los gráficos a una dirección de correo.

En el siguiente diagrama se muestra la arquitectura general:

Flujo de procesamiento de BigQuery

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Antes de empezar

Es posible que las restricciones de seguridad definidas por tu organización te impidan completar los siguientes pasos. Para obtener información sobre cómo solucionar problemas, consulta el artículo Desarrollar aplicaciones en un entorno limitado Google Cloud .

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.

  3. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  4. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  5. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Scheduler, Eventarc, and Pub/Sub APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com cloudscheduler.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com
  8. Install the Google Cloud CLI.

  9. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  10. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  11. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Verify that billing is enabled for your Google Cloud project.

  13. Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Scheduler, Eventarc, and Pub/Sub APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com cloudscheduler.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com
  14. En Cloud Storage, habilita el registro de auditoría para los tipos de acceso a datos ADMIN_READ, DATA_WRITE y DATA_READ.

    1. Lee la política de gestión de identidades y accesos (IAM) asociada a tu Google Cloud proyecto, carpeta u organización y guárdala en un archivo temporal:
      gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
    2. En un editor de texto, abre /tmp/policy.yaml y añade o cambia solo la configuración del registro de auditoría en la sección auditConfigs:

      .

      
        auditConfigs:
        - auditLogConfigs:
          - logType: ADMIN_READ
          - logType: DATA_WRITE
          - logType: DATA_READ
          service: storage.googleapis.com
        bindings:
        - members:
        [...]
        etag: BwW_bHKTV5U=
        version: 1
    3. Escribe la nueva política de gestión de identidades y accesos:

      gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml

      Si el comando anterior informa de un conflicto con otro cambio, repite estos pasos, empezando por leer la política de IAM. Para obtener más información, consulta el artículo sobre cómo configurar registros de auditoría de acceso a datos con la API.

  15. Asigna el rol eventarc.eventReceiver a la cuenta de servicio de Compute Engine:

    export PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')"
    
    gcloud projects add-iam-policy-binding $(gcloud config get-value project) \
        --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \
        --role='roles/eventarc.eventReceiver'

  16. Si habilitaste la cuenta de servicio de Pub/Sub el 8 de abril del 2021 o antes, otorga el rol iam.serviceAccountTokenCreator a la cuenta de servicio de Pub/Sub:

    gcloud projects add-iam-policy-binding $(gcloud config get-value project) \
        --member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"\
        --role='roles/iam.serviceAccountTokenCreator'

  17. Define los valores predeterminados que se usarán en este tutorial:
    export REGION=REGION
    gcloud config set run/region ${REGION}
    gcloud config set run/platform managed
    gcloud config set eventarc/location ${REGION}

    Sustituye REGION por la ubicación de Eventarc que quieras.

  18. Crear una clave de API de SendGrid

    SendGrid es un proveedor de correo basado en la nube que te permite enviar correos sin tener que mantener servidores de correo.

    1. Inicia sesión en SendGrid y ve a Configuración > Claves de API.
    2. Haz clic en Crear clave de API.
    3. Selecciona los permisos de la clave. Como mínimo, la clave debe tener permisos de Envío de correo para enviar correos.
    4. Ponle un nombre a la clave y haz clic en Guardar para crearla.
    5. SendGrid genera una nueva clave. Esta es la única copia de la clave, así que asegúrate de copiarla y guardarla para más adelante.

    Crear un repositorio estándar de Artifact Registry

    Crea un repositorio estándar de Artifact Registry para almacenar tu imagen de contenedor Docker:

    gcloud artifacts repositories create REPOSITORY \
        --repository-format=docker \
        --location=$REGION

    Sustituye REPOSITORY por un nombre único para el repositorio.

    Crea un segmento de Cloud Storage

    Crea un segmento de Cloud Storage único para guardar los gráficos. Asegúrate de que el segmento y los gráficos sean públicos y estén en la misma región que tu servicio de Cloud Run:

    export BUCKET="$(gcloud config get-value core/project)-charts"
    gcloud storage buckets create gs://${BUCKET} --location=$(gcloud config get-value run/region)
    gcloud storage buckets update gs://${BUCKET} --uniform-bucket-level-access
    gcloud storage buckets add-iam-policy-binding gs://${BUCKET} --member=allUsers --role=roles/storage.objectViewer

    Implementar el servicio Notifier

    Implementa un servicio de Cloud Run que reciba eventos de Chart Creator y use SendGrid para enviar por correo enlaces a los gráficos generados.

    1. Clona el repositorio de GitHub y cambia al directorio notifier/python:

      git clone https://github.com/GoogleCloudPlatform/eventarc-samples
      cd eventarc-samples/processing-pipelines/bigquery/notifier/python/
    2. Crea y envía la imagen del contenedor:

      export SERVICE_NAME=notifier
      docker build -t $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 .
      docker push $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
    3. Despliega la imagen de contenedor en Cloud Run. Para ello, indica una dirección a la que enviar correos y la clave de API de SendGrid:

      export TO_EMAILS=EMAIL_ADDRESS
      export SENDGRID_API_KEY=YOUR_SENDGRID_API_KEY
      gcloud run deploy ${SERVICE_NAME} \
          --image $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \
          --update-env-vars TO_EMAILS=${TO_EMAILS},SENDGRID_API_KEY=${SENDGRID_API_KEY},BUCKET=${BUCKET} \
          --allow-unauthenticated

      Haz los cambios siguientes:

      • EMAIL_ADDRESS con una dirección de correo electrónico para enviar los enlaces a los gráficos generados
      • YOUR_SENDGRID_API_KEY con la clave de API de SendGrid que has anotado anteriormente.

    Cuando veas la URL del servicio, el despliegue se habrá completado.

    Crear un activador para el servicio Notifier

    El activador de Eventarc del servicio Notifier implementado en Cloud Run filtra los registros de auditoría de Cloud Storage en los que methodName es storage.objects.create.

    1. Crea el activador:

      gcloud eventarc triggers create trigger-${SERVICE_NAME} \
          --destination-run-service=${SERVICE_NAME} \
          --destination-run-region=${REGION} \
          --event-filters="type=google.cloud.audit.log.v1.written" \
          --event-filters="serviceName=storage.googleapis.com" \
          --event-filters="methodName=storage.objects.create" \
          --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com

      De esta forma, se crea un activador llamado trigger-notifier.

    Desplegar el servicio Chart Creator

    Implementa un servicio de Cloud Run que reciba eventos de Query Runner, recupere datos de una tabla de BigQuery de un país específico y, a continuación, genere un gráfico a partir de los datos con Matplotlib. El gráfico se sube a un segmento de Cloud Storage.

    1. Cambia al directorio chart-creator/python:

      cd ../../chart-creator/python
    2. Crea y envía la imagen del contenedor:

      export SERVICE_NAME=chart-creator
      docker build -t $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 .
      docker push $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
    3. Despliega la imagen de contenedor en Cloud Run y pasa BUCKET:

      gcloud run deploy ${SERVICE_NAME} \
          --image $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \
          --update-env-vars BUCKET=${BUCKET} \
          --allow-unauthenticated

    Cuando veas la URL del servicio, el despliegue se habrá completado.

    Crear un activador para el servicio Chart Creator

    El activador de Eventarc del servicio Chart Creator implementado en Cloud Run filtra los mensajes publicados en un tema de Pub/Sub.

    1. Crea el activador:

      gcloud eventarc triggers create trigger-${SERVICE_NAME} \
          --destination-run-service=${SERVICE_NAME} \
          --destination-run-region=${REGION} \
          --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished"

      De esta forma, se crea un activador llamado trigger-chart-creator.

    2. Define la variable de entorno del tema de Pub/Sub.

      export TOPIC_QUERY_COMPLETED=$(basename $(gcloud eventarc triggers describe trigger-${SERVICE_NAME} --format='value(transport.pubsub.topic)'))

    Desplegar el servicio Query Runner

    Implementa un servicio de Cloud Run que recibe eventos de Cloud Scheduler, obtiene datos de un conjunto de datos público sobre la COVID-19 y guarda los resultados en una nueva tabla de BigQuery.

    1. Cambia al directorio processing-pipelines:

      cd ../../..
    2. Crea y envía la imagen del contenedor:

      export SERVICE_NAME=query-runner
      docker build -t $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 -f Dockerfile .
      docker push $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
    3. Despliega la imagen de contenedor en Cloud Run y pasa PROJECT_ID y TOPIC_QUERY_COMPLETED:

      gcloud run deploy ${SERVICE_NAME} \
          --image $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \
          --update-env-vars PROJECT_ID=$(gcloud config get-value project),TOPIC_ID=${TOPIC_QUERY_COMPLETED} \
          --allow-unauthenticated

    Cuando veas la URL del servicio, el despliegue se habrá completado.

    Crear un activador para el servicio Query Runner

    El activador de Eventarc del servicio Query Runner implementado en Cloud Run filtra los mensajes publicados en un tema de Pub/Sub.

    1. Crea el activador:

      gcloud eventarc triggers create trigger-${SERVICE_NAME} \
          --destination-run-service=${SERVICE_NAME} \
          --destination-run-region=${REGION} \
          --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished"

      De esta forma, se crea un activador llamado trigger-query-runner.

    2. Define una variable de entorno para el tema de Pub/Sub.

      export TOPIC_QUERY_SCHEDULED=$(gcloud eventarc triggers describe trigger-${SERVICE_NAME} --format='value(transport.pubsub.topic)')

    Programar las tareas

    El flujo de procesamiento se activa mediante dos tareas de Cloud Scheduler.

    1. Crea una aplicación de App Engine, que es necesaria para Cloud Scheduler, y especifica una ubicación adecuada:

      export APP_ENGINE_LOCATION=LOCATION
      gcloud app create --region=${APP_ENGINE_LOCATION}
    2. Crea dos tareas de Cloud Scheduler que publiquen en un tema de Pub/Sub una vez al día:

      gcloud scheduler jobs create pubsub cre-scheduler-uk \
          --schedule="0 16 * * *" \
          --topic=${TOPIC_QUERY_SCHEDULED} \
          --message-body="United Kingdom"
      gcloud scheduler jobs create pubsub cre-scheduler-cy \
          --schedule="0 17 * * *" \
          --topic=${TOPIC_QUERY_SCHEDULED} \
          --message-body="Cyprus"

      La programación se especifica en formato cron de UNIX. Por ejemplo, 0 16 * * * significa que los trabajos se ejecutan a las 16:00 (4:00 PM) UTC todos los días.

    Ejecutar el flujo de procesamiento

    1. Primero, confirma que todos los activadores se han creado correctamente:

      gcloud eventarc triggers list

      La salida debería ser similar a la siguiente:

      NAME: trigger-chart-creator
      TYPE: google.cloud.pubsub.topic.v1.messagePublished
      DESTINATION: Cloud Run service: chart-creator
      ACTIVE: Yes
      LOCATION: us-central1
      
      NAME: trigger-notifier
      TYPE: google.cloud.audit.log.v1.written
      DESTINATION: Cloud Run service: notifier
      ACTIVE: Yes
      LOCATION: us-central1
      
      NAME: trigger-query-runner
      TYPE: google.cloud.pubsub.topic.v1.messagePublished
      DESTINATION: Cloud Run service: query-runner
      ACTIVE: Yes
      LOCATION: us-central1
      
    2. Recupera los IDs de las tareas de Cloud Scheduler:

      gcloud scheduler jobs list

      La salida debería ser similar a la siguiente:

      ID                LOCATION      SCHEDULE (TZ)         TARGET_TYPE  STATE
      cre-scheduler-cy  us-central1   0 17 * * * (Etc/UTC)  Pub/Sub      ENABLED
      cre-scheduler-uk  us-central1   0 16 * * * (Etc/UTC)  Pub/Sub      ENABLED
      
    3. Aunque las tareas están programadas para ejecutarse todos los días a las 16:00 y a las 17:00, también puedes ejecutarlas manualmente:

      gcloud scheduler jobs run cre-scheduler-cy
      gcloud scheduler jobs run cre-scheduler-uk
    4. Al cabo de unos minutos, confirma que hay dos gráficos en el segmento de Cloud Storage:

      gcloud storage ls gs://${BUCKET}

      La salida debería ser similar a la siguiente:

      gs://BUCKET/chart-cyprus.png
      gs://BUCKET/chart-unitedkingdom.png
      

    ¡Enhorabuena! También deberías recibir dos correos con enlaces a los gráficos.

    Limpieza

    Si has creado un proyecto para este tutorial, elimínalo. Si has usado un proyecto y quieres conservarlo sin los cambios que has añadido en este tutorial, elimina los recursos creados para el tutorial.

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Eliminar recursos del tutorial

    1. Elimina los servicios de Cloud Run que hayas desplegado en este tutorial:

      gcloud run services delete SERVICE_NAME

      Donde SERVICE_NAME es el nombre del servicio que has elegido.

      También puedes eliminar servicios de Cloud Run desde la Google Cloud consola.

    2. Elimina las configuraciones predeterminadas de Google Cloud CLI que hayas añadido durante la configuración del tutorial.

      gcloud config unset project
      gcloud config unset run/region
      gcloud config unset run/platform
      gcloud config unset eventarc/location
    3. Elimina los activadores de Eventarc que hayas creado en este tutorial:

       gcloud eventarc triggers delete TRIGGER_NAME
       
      Sustituye TRIGGER_NAME por el nombre de tu activador.

    4. Elimina las imágenes de Artifact Registry.

      gcloud artifacts docker images delete $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/notifier:v1
      gcloud artifacts docker images delete $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/chart-creator:v1
      gcloud artifacts docker images delete $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/query-runner:v1
    5. Elimina el segmento junto con todos los objetos que contiene:

      gcloud storage rm --recursive gs://${BUCKET}/
    6. Elimina las tareas de Cloud Scheduler:

      gcloud scheduler jobs delete cre-scheduler-cy
      gcloud scheduler jobs delete cre-scheduler-uk

    Siguientes pasos