En este tutorial se explica cómo usar Eventarc para crear un flujo 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 Knative que se ejecutan en un clúster de Google Kubernetes Engine (GKE) y que reciben eventos mediante Eventarc:
- Ejecutor de consultas: 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.
- Creador de gráficos: se activa cuando el servicio de ejecución 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 los guarda en un bucket de Cloud Storage.
- Notificador: se activa mediante registros de auditoría cuando el servicio del creador de gráficos almacena un gráfico en un segmento de Cloud Storage. Este servicio usa el servicio de correo electrónico SendGrid para enviar enlaces de los gráficos a una dirección de correo.
En el siguiente diagrama se muestra la arquitectura general:
Costes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
- Artifact Registry
- BigQuery
- Cloud Build
- Cloud Scheduler
- Cloud Storage
- Eventarc
- Google Kubernetes Engine
- Pub/Sub
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Antes de empezar
- 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.
-
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
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 theresourcemanager.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.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Scheduler, Eventarc, GKE, Pub/Sub, and Resource Manager APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudresourcemanager.googleapis.com cloudscheduler.googleapis.com container.googleapis.com eventarc.googleapis.com pubsub.googleapis.com run.googleapis.com logging.googleapis.com -
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
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 theresourcemanager.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.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Scheduler, Eventarc, GKE, Pub/Sub, and Resource Manager APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudresourcemanager.googleapis.com cloudscheduler.googleapis.com container.googleapis.com eventarc.googleapis.com pubsub.googleapis.com run.googleapis.com logging.googleapis.com - En Cloud Storage, habilita el registro de auditoría para los tipos de acceso a datos
ADMIN_READ
,DATA_WRITE
yDATA_READ
.- 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
- 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ónauditConfigs
: .auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_WRITE - logType: DATA_READ service: storage.googleapis.com bindings: - members: [...] etag: BwW_bHKTV5U= version: 1
- 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.
- 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:
- Define los valores predeterminados que se usarán en este tutorial:
CLUSTER_NAME=events-cluster CLUSTER_LOCATION=us-central1 PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID gcloud config set run/region $CLUSTER_LOCATION gcloud config set run/cluster $CLUSTER_NAME gcloud config set run/cluster_location $CLUSTER_LOCATION gcloud config set run/platform gke gcloud config set eventarc/location $CLUSTER_LOCATION
Sustituye
PROJECT_ID
por el ID del proyecto. - Inicia sesión en SendGrid y ve a Configuración > Claves de API.
- Haz clic en Crear clave de API.
- Selecciona los permisos de la clave. Como mínimo, la clave debe tener permisos de Envío de correo para enviar correos.
- Haz clic en Guardar para crear la clave.
- 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.
Crea un clúster de GKE para Knative Serving con los complementos
CloudRun
,HttpLoadBalancing
yHorizontalPodAutoscaling
habilitados:gcloud beta container clusters create $CLUSTER_NAME \ --addons=HttpLoadBalancing,HorizontalPodAutoscaling,CloudRun \ --machine-type=n1-standard-4 \ --enable-autoscaling --min-nodes=2 --max-nodes=10 \ --no-issue-client-certificate --num-nodes=2 \ --logging=SYSTEM,WORKLOAD \ --monitoring=SYSTEM \ --scopes=cloud-platform,logging-write,monitoring-write,pubsub \ --zone us-central1 \ --release-channel=rapid \ --workload-pool=$PROJECT_ID.svc.id.goog
Espera unos minutos a que se cree el clúster. Durante el proceso, es posible que veas advertencias que puedes ignorar sin problema. Cuando se haya creado el clúster, el resultado será similar al siguiente:
Creating cluster ...done. Created [https://container.googleapis.com/v1beta1/projects/my-project/zones/us-central1/clusters/events-cluster].
Crea un repositorio estándar de Artifact Registry para almacenar tu imagen de contenedor Docker:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$CLUSTER_LOCATION
Sustituye
REPOSITORY
por un nombre único para el repositorio.Crea un enlace de gestión de identidades y accesos (IAM) entre las cuentas de servicio:
PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')" gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[default/default]" \ $PROJECT_NUMBER-compute@developer.gserviceaccount.com
Añade la anotación
iam.gke.io/gcp-service-account
a la cuenta de servicio de GKE con la dirección de correo de la cuenta de servicio de Compute:kubectl annotate serviceaccount \ --namespace default \ default \ iam.gke.io/gcp-service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
Habilita los destinos de GKE para Eventarc:
gcloud eventarc gke-destinations init
Cuando se te pida que enlaces los roles necesarios, introduce
y
.Se han vinculado los siguientes roles:
roles/compute.viewer
roles/container.developer
roles/iam.serviceAccountAdmin
Crea una cuenta de servicio llamada
TRIGGER_GSA
:TRIGGER_GSA=eventarc-bigquery-triggers gcloud iam service-accounts create $TRIGGER_GSA
Asigna los roles
pubsub.subscriber
,monitoring.metricWriter
yeventarc.eventReceiver
a la cuenta de servicio:PROJECT_ID=$(gcloud config get-value project) gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/pubsub.subscriber" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/monitoring.metricWriter" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/eventarc.eventReceiver"
Crea y envía la imagen del contenedor:
pushd bigquery/notifier/python export SERVICE_NAME=notifier docker build -t $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 . docker push $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 popd
Despliega la imagen de contenedor en Knative Serving. 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 $CLUSTER_LOCATION-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}
Haz los cambios siguientes:
EMAIL_ADDRESS
: una dirección de correo a la que enviar los enlaces a los gráficos generadosYOUR_SENDGRID_API_KEY
: la clave de API de SendGrid que has anotado anteriormente
Crea el activador:
gcloud eventarc triggers create trigger-${SERVICE_NAME}-gke \ --destination-gke-cluster=$CLUSTER_NAME \ --destination-gke-location=$CLUSTER_LOCATION \ --destination-gke-namespace=default \ --destination-gke-service=$SERVICE_NAME \ --destination-gke-path=/ \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
De esta forma, se crea un activador llamado
trigger-notifier-gke
.Crea y envía la imagen del contenedor:
pushd bigquery/chart-creator/python export SERVICE_NAME=chart-creator docker build -t $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 . docker push $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 popd
Despliega la imagen de contenedor en Knative Serving y pasa lo siguiente:
BUCKET
gcloud run deploy ${SERVICE_NAME} \ --image $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \ --update-env-vars BUCKET=${BUCKET}
Crea el activador:
gcloud eventarc triggers create trigger-${SERVICE_NAME}-gke \ --destination-gke-cluster=$CLUSTER_NAME \ --destination-gke-location=$CLUSTER_LOCATION \ --destination-gke-namespace=default \ --destination-gke-service=$SERVICE_NAME \ --destination-gke-path=/ \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
De esta forma, se crea un activador llamado
trigger-chart-creator-gke
.Define la variable de entorno del tema de Pub/Sub.
export TOPIC_QUERY_COMPLETED=$(basename $(gcloud eventarc triggers describe trigger-${SERVICE_NAME}-gke --format='value(transport.pubsub.topic)'))
Crea y envía la imagen del contenedor:
export SERVICE_NAME=query-runner docker build -t $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 -f Dockerfile . docker push $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
Despliega la imagen de contenedor en Knative Serving. Para ello, introduce
PROJECT_ID
yTOPIC_QUERY_COMPLETED
:gcloud run deploy ${SERVICE_NAME} \ --image $CLUSTER_LOCATION-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}
Crea el activador:
gcloud eventarc triggers create trigger-${SERVICE_NAME}-gke \ --destination-gke-cluster=$CLUSTER_NAME \ --destination-gke-location=$CLUSTER_LOCATION \ --destination-gke-namespace=default \ --destination-gke-service=$SERVICE_NAME \ --destination-gke-path=/ \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
De esta forma, se crea un activador llamado
trigger-query-runner-gke
.Define una variable de entorno para el tema de Pub/Sub.
export TOPIC_QUERY_SCHEDULED=$(gcloud eventarc triggers describe trigger-${SERVICE_NAME}-gke --format='value(transport.pubsub.topic)')
Crea una aplicación de App Engine, que es necesaria para Cloud Scheduler, y especifica una ubicación adecuada (por ejemplo,
europe-west
):export APP_ENGINE_LOCATION=LOCATION gcloud app create --region=${APP_ENGINE_LOCATION}
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.Confirma que todos los activadores se han creado correctamente:
gcloud eventarc triggers list
La salida debería ser similar a la siguiente:
NAME TYPE DESTINATION ACTIVE LOCATION trigger-chart-creator-gke google.cloud.pubsub.topic.v1.messagePublished GKE:chart-creator Yes us-central1 trigger-notifier-gke google.cloud.audit.log.v1.written GKE:notifier Yes us-central1 trigger-query-runner-gke google.cloud.pubsub.topic.v1.messagePublished GKE:query-runner Yes us-central1
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
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
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://PROJECT_ID-charts/chart-cyprus.png gs://PROJECT_ID-charts/chart-unitedkingdom.png
Elimina los servicios de Knative Serving 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 Knative Serving desde la Google Cloud consola.
Elimina los activadores de Eventarc que hayas creado en este tutorial:
gcloud eventarc triggers delete TRIGGER_NAME
Sustituye
TRIGGER_NAME
por el nombre del activador.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/cluster gcloud config unset run/cluster_location gcloud config unset run/platform gcloud config unset eventarc/location gcloud config unset compute/zone
Elimina las imágenes de Artifact Registry.
gcloud artifacts docker images delete $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/notifier:v1 gcloud artifacts docker images delete $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/chart-creator:v1 gcloud artifacts docker images delete $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/query-runner:v1
Elimina el segmento junto con todos los objetos que contiene:
gcloud storage rm --recursive gs://${BUCKET}/
Elimina las tareas de Cloud Scheduler:
gcloud scheduler jobs delete cre-scheduler-cy gcloud scheduler jobs delete cre-scheduler-uk
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.
Crear un clúster de GKE
Crea un clúster con Workload Identity Federation for GKE habilitado para que pueda acceder a los servicios de las aplicaciones que se ejecutan en GKE. Google Cloud También necesitas Workload Identity Federation para GKE para reenviar eventos mediante Eventarc.
Configurar la cuenta de servicio de GKE
Configura una cuenta de servicio de GKE para que actúe como cuenta de servicio de Compute predeterminada.
Habilitar destinos de GKE
Para permitir que Eventarc gestione recursos en el clúster de GKE, habilita los destinos de GKE y vincula la cuenta de servicio de Eventarc con los roles necesarios.
Crear una cuenta de servicio y vincular roles de acceso
Antes de crear el activador de Eventarc, configura una cuenta de servicio gestionada por el usuario y concédele roles específicos para que Eventarc pueda reenviar eventos de Pub/Sub.
Crea un segmento de Cloud Storage
Crea un segmento de Cloud Storage para guardar los gráficos. Asegúrate de que el segmento y los gráficos estén disponibles públicamente y en la misma región que tu servicio de GKE:
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
Clonar el repositorio
Clona el repositorio de GitHub.
git clone https://github.com/GoogleCloudPlatform/eventarc-samples cd eventarc-samples/processing-pipelines
Implementar el servicio de notificaciones
Desde el directorio bigquery/notifier/python
, despliega un servicio de Knative Serving que reciba eventos de creador de gráficos y use SendGrid para enviar por correo enlaces a los gráficos generados.
Cuando veas la URL del servicio, el despliegue se habrá completado.
Crear un activador para el servicio de notificaciones
El activador de Eventarc del servicio de notificaciones implementado en Knative Serving filtra los registros de auditoría de Cloud Storage en los que el valor de methodName es storage.objects.create
.
Desplegar el servicio de creación de gráficos
En el directorio bigquery/chart-creator/python
, implementa un servicio de Knative Serving 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 con Matplotlib a partir de los datos. El gráfico se sube a un segmento de Cloud Storage.
Cuando veas la URL del servicio, el despliegue se habrá completado.
Crear un activador para el servicio de creación de gráficos
El activador de Eventarc del servicio de creación de gráficos implementado en Knative Serving filtra los mensajes publicados en un tema de Pub/Sub.
Desplegar el servicio de ejecución de consultas
En el directorio processing-pipelines
, implementa un servicio de Knative Serving que reciba eventos de Cloud Scheduler, obtenga datos de un conjunto de datos público sobre el COVID-19 y guarde los resultados en una tabla de BigQuery.
Cuando veas la URL del servicio, el despliegue se habrá completado.
Crear un activador para el servicio de ejecución de consultas
El activador de Eventarc del servicio de ejecución de consultas implementado en Knative Serving filtra los mensajes publicados en un tema de Pub/Sub.
Programar las tareas
El flujo de procesamiento se activa mediante dos tareas de Cloud Scheduler.
Ejecutar el flujo de procesamiento
¡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