Compilar una canalización de procesamiento de BigQuery con Eventarc


En este instructivo, se muestra cómo usar Eventarc para compilar una canalización de procesamiento que programe consultas a un conjunto de datos públicos de BigQuery, genere gráficos basados en los datos y comparta vínculos a los gráficos por correo electrónico.

Objetivos

En este instructivo, compilarás e implementarás tres servicios de Cloud Run que permiten el acceso no autenticado y que reciben eventos mediante Eventarc:

  1. Ejecutor de consultas: Se activa cuando los trabajos 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úblicos sobre el COVID-19 y guardar los resultados en una nueva tabla de BigQuery.
  2. Creador de gráficos: Se activa cuando el servicio del ejecutor de consultas publica un mensaje en un tema de Pub/Sub. Este servicio genera gráficos con la biblioteca de trazado de Python Matplotlib y guarda los gráficos en un bucket de Cloud Storage.
  3. Notificador: Se activa mediante registros de auditoría cuando el servicio Creador de gráficos almacena un gráfico en un bucket de Cloud Storage; este servicio usa el servicio de correo electrónico SendGrid para enviar vínculos a los gráficos a una dirección de correo electrónico.

En el siguiente diagrama, se muestra la arquitectura de alto nivel:

Canalización de procesamiento de BigQuery

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

Es posible que las restricciones de seguridad que define tu organización no te permitan completar los siguientes pasos. Para obtener información sobre la solución de problemas, consulta Desarrolla aplicaciones en un entorno de Google Cloud restringido.

  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. To initialize the gcloud CLI, run the following command:

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

    • 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.

  5. Make sure that billing is enabled for your Google Cloud project.

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

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com cloudscheduler.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

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

    • 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.

  10. Make sure that billing is enabled for your Google Cloud project.

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

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

    1. Lee la política de Identity and Access Management (IAM) asociada con tu organización, carpeta o proyecto de Google Cloud y almacénala 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 agrega 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 tu nueva política de IAM:

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

      Si el comando anterior informa de un conflicto con otro cambio, repite estos pasos y comienza por la lectura de la política de IAM. Para obtener más información, consulta Configura los registros de auditoría de acceso a los datos con la API.

  13. Otorga 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'

  14. Si habilitaste la cuenta de servicio de Pub/Sub el 8 de abril de 2021 o antes de esa fecha, 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'

  15. Establece los valores predeterminados que se usan en este instructivo:
    export REGION=REGION
    gcloud config set run/region ${REGION}
    gcloud config set run/platform managed
    gcloud config set eventarc/location ${REGION}

    Reemplaza REGION por la ubicación de Eventarc compatible que prefieras.

Crea una clave de API de SendGrid

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

  1. Accede a Sendgrid y ve a Configuración > Claves de API.
  2. Haz clic en Crear clave de API.
  3. Selecciona los permisos de la clave. La clave debe tener como mínimo permisos de envío de correo electrónico para enviar correos electrónicos.
  4. Asigna un nombre a tu clave y haz clic en Guardar para crearla.
  5. SendGrid genera una clave nueva. Esta es la única copia de la clave, así que asegúrate de copiarla y guardarla para más adelante.

Crea un repositorio estándar de Artifact Registry

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

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

Reemplaza REPOSITORY por un nombre único para el repositorio.

Crea un bucket de Cloud Storage

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

export BUCKET="$(gcloud config get-value core/project)-charts"
gsutil mb -l $(gcloud config get-value run/region) gs://${BUCKET}
gsutil uniformbucketlevelaccess set on gs://${BUCKET}
gsutil iam ch allUsers:objectViewer gs://${BUCKET}

Implementa el servicio de notificador

Implementa un servicio de Cloud Run que reciba eventos de Creador de gráficos y use SendGrid para enviar vínculos por correo electrónico 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. Compila 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. Implementa la imagen de contenedor en Cloud Run y pasa una dirección a la que se enviarán los correos electrónicos. Esto es lo que sucede con 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

    Reemplaza lo siguiente:

    • EMAIL_ADDRESS por una dirección de correo electrónico para enviar los vínculos a los gráficos generados
    • YOUR_SENDGRID_API_KEY por la clave de API de SendGrid que anotaste antes

Cuando veas la URL del servicio, se completará la implementación.

Crea un activador para el servicio Notificador

El activador de Eventarc para el servicio Notificador implementado en los filtros de Cloud Run de los registros de auditoría de Cloud Storage donde el 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

    Esto crea un activador llamado trigger-notifier.

Implementa el servicio del creador de gráficos

Implementa un servicio de Cloud Run que reciba eventos del ejecutor de consultas, recupere datos de una tabla de BigQuery para un país específico y, luego, genere un gráfico mediante Matplotlib a partir de los datos. El gráfico se sube a un bucket de Cloud Storage.

  1. Cambia al directorio chart-creator/python:

    cd ../../chart-creator/python
  2. Compila 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. Implementa 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, se completará la implementación.

Crea un activador para el servicio Creador de gráficos

El activador de Eventarc para el servicio Creador de gráficos implementado en los filtros de Cloud Run de 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"

    Esto crea un activador llamado trigger-chart-creator.

  2. Configura 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)'))

Implementa el servicio del ejecutor de consultas

Implementa un servicio de Cloud Run que reciba eventos de Cloud Scheduler, recupere datos de un conjunto de datos públicos sobre el COVID-19 y guarde los resultados en una tabla nueva de BigQuery.

  1. Cambia al directorio processing-pipelines:

    cd ../../..
  2. Compila 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. Implementa 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, se completará la implementación.

Crea un activador para el servicio Ejecutor de consultas

El activador de Eventarc para el servicio del ejecutor de consultas implementado en los filtros de Cloud Run de 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"

    Esto crea un activador llamado trigger-query-runner.

  2. Configura 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)')

Programa los trabajos

La canalización de procesamiento se activa mediante dos trabajos de Cloud Scheduler.

  1. Crea una aplicación de App Engine que requiera Cloud Scheduler y especifica una ubicación adecuada:

    export APP_ENGINE_LOCATION=LOCATION
    gcloud app create --region=${APP_ENGINE_LOCATION}
  2. Crea dos trabajos de Cloud Scheduler que se 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"

    El programa se especifica en formato unix-cron. Por ejemplo, 0 16 * * * significa que los trabajos se ejecutan a las 16:00 (4 p.m.) UTC todos los días.

Ejecuta la canalización

  1. Primero, confirma que todos los activadores se hayan creado de forma correcta:

    gcloud eventarc triggers list

    El resultado debería ser similar al siguiente ejemplo:

    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 ID de trabajo de Cloud Scheduler:

    gcloud scheduler jobs list

    El resultado debería ser similar al ejemplo 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 los trabajos están programados para ejecutarse a diario a las 4 y 5 p.m., también puedes ejecutar los trabajos de Cloud Scheduler de forma manual:

    gcloud scheduler jobs run cre-scheduler-cy
    gcloud scheduler jobs run cre-scheduler-uk
  4. Después de unos minutos, confirma que haya dos gráficos en el bucket de Cloud Storage:

    gsutil ls gs://${BUCKET}

    El resultado debería ser similar al ejemplo siguiente:

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

¡Felicitaciones! También deberías recibir dos correos electrónicos con vínculos a los gráficos.

Realiza una limpieza

Si creaste un proyecto nuevo para este instructivo, bórralo. Si usaste un proyecto existente y quieres conservarlo sin los cambios que se agregaron en este instructivo, borra los recursos creados para el instructivo.

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Elimina recursos de instructivos

  1. Borra los servicios de Cloud Run que implementaste en este instructivo:

    gcloud run services delete SERVICE_NAME

    En el ejemplo anterior, SERVICE_NAME es el nombre del servicio que elegiste.

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

  2. Quita las opciones de configuración predeterminadas de Google Cloud CLI que agregaste durante la configuración del instructivo.

    gcloud config unset project
    gcloud config unset run/region
    gcloud config unset run/platform
    gcloud config unset eventarc/location
  3. Borra cualquier activador de Eventarc que hayas creado en este instructivo:

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

  4. Borra 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. Borra el bucket, junto con todos los objetos dentro del bucket:

    gcloud storage rm --recursive gs://${BUCKET}/
  6. Borra los trabajos de Cloud Scheduler:

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

¿Qué sigue?