Questo tutorial mostra come utilizzare Eventarc per creare una pipeline di elaborazione che pianifica query su un set di dati BigQuery pubblico, genera grafici in base ai dati e condivide i link ai grafici tramite email.
Obiettivi
In questo tutorial, creerai ed eseguirai il deployment di tre servizi Cloud Run che consentono l'accesso non autenticato e che ricevono eventi utilizzando Eventarc:
- Query Runner: attivato quando i job Cloud Scheduler pubblicano un messaggio in un argomento Pub/Sub, questo servizio utilizza l'API BigQuery per recuperare i dati da un set di dati pubblico sul COVID-19 e salva i risultati in una nuova tabella BigQuery.
- Chart Creator: attivato quando il servizio Query Runner pubblica un messaggio in un argomento Pub/Sub, questo servizio genera grafici utilizzando la libreria di tracciamento Python, Matplotlib, e salva i grafici in un bucket Cloud Storage.
- Notifier: attivato dai log di controllo quando il servizio Chart Creator archivia un grafico in un bucket Cloud Storage, questo servizio utilizza il servizio email SendGrid per inviare link ai grafici a un indirizzo email.
Il seguente diagramma mostra l'architettura di alto livello:
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il Calcolatore prezzi.
Prima di iniziare
I vincoli di sicurezza definiti dalla tua organizzazione potrebbero impedirti di completare i passaggi seguenti. Per informazioni sulla risoluzione dei problemi, vedi Sviluppare applicazioni in un ambiente Google Cloud vincolato.
- 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.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo 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 role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith 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_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enablepermission. 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 -
Install the Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo 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 role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith 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_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enablepermission. 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 - Per Cloud Storage, abilita l'audit logging per i tipi di accesso ai dati
ADMIN_READ,DATA_WRITEeDATA_READ.- Leggi il criterio Identity and Access Management (IAM) associato al tuo
Google Cloud progetto, cartella o organizzazione e archivialo in un file temporaneo:
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
- In un editor di testo, apri
/tmp/policy.yamle aggiungi o modifica solo la configurazione del log di controllo nella sezioneauditConfigs:auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_WRITE - logType: DATA_READ service: storage.googleapis.com bindings: - members: [...] etag: BwW_bHKTV5U= version: 1
- Scrivi il nuovo criterio IAM:
gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
Se il comando precedente segnala un conflitto con un'altra modifica, allora ripeti questi passaggi, a partire dalla lettura della policy IAM. Per ulteriori informazioni, consulta Configurare gli audit log di accesso ai dati con l'API.
- Leggi il criterio Identity and Access Management (IAM) associato al tuo
Google Cloud progetto, cartella o organizzazione e archivialo in un file temporaneo:
- Concedi il ruolo
eventarc.eventReceiveral account di servizio 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'
- Se hai attivato l'account di servizio Pub/Sub l'8 aprile 2021 o in una data precedente, concedi il ruolo
iam.serviceAccountTokenCreatorall'account di servizio 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'
- Imposta i valori predefiniti utilizzati in questo tutorial:
export REGION=REGION gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
Sostituisci
REGIONcon la posizione Eventarc supportata che preferisci. - Accedi a SendGrid e vai a Impostazioni > Chiavi API.
- Fai clic su Crea chiave API.
- Seleziona le autorizzazioni per la chiave. Per inviare email, la chiave deve disporre come minimo delle autorizzazioni per l'invio di email.
- Assegna un nome alla chiave e fai clic su Salva per crearla.
- SendGrid genera una nuova chiave. Si tratta dell'unica copia della chiave, quindi assicurati di copiarla e salvarla per utilizzarla in un secondo momento.
Clona il repository GitHub e passa alla directory
notifier/python:git clone https://github.com/GoogleCloudPlatform/eventarc-samples cd eventarc-samples/processing-pipelines/bigquery/notifier/python/
Crea ed esegui il push dell'immagine container:
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
Esegui il deployment dell'immagine container in Cloud Run, passando un indirizzo a cui inviare le email e la chiave API 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
Sostituisci quanto segue:
EMAIL_ADDRESScon un indirizzo email a cui inviare i link ai grafici generatiYOUR_SENDGRID_API_KEYcon la chiave API SendGrid che hai annotato in precedenza
Crea il trigger:
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
Viene creato un trigger denominato
trigger-notifier.Passa alla directory
chart-creator/python:cd ../../chart-creator/python
Crea ed esegui il push dell'immagine container:
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
Esegui il deployment dell'immagine container su Cloud Run, passando
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
Crea il trigger:
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"
Viene creato un trigger denominato
trigger-chart-creator.Imposta la variabile di ambiente dell'argomento Pub/Sub.
export TOPIC_QUERY_COMPLETED=$(basename $(gcloud eventarc triggers describe trigger-${SERVICE_NAME} --format='value(transport.pubsub.topic)'))
Passa alla directory
processing-pipelines:cd ../../..
Crea ed esegui il push dell'immagine container:
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
Esegui il deployment dell'immagine container su Cloud Run, passando
PROJECT_IDeTOPIC_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
Crea il trigger:
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"
Viene creato un trigger denominato
trigger-query-runner.Imposta una variabile di ambiente per l'argomento Pub/Sub.
export TOPIC_QUERY_SCHEDULED=$(gcloud eventarc triggers describe trigger-${SERVICE_NAME} --format='value(transport.pubsub.topic)')
Crea un'app App Engine richiesta da Cloud Scheduler e specifica una posizione appropriata:
export APP_ENGINE_LOCATION=LOCATION gcloud app create --region=${APP_ENGINE_LOCATION}
Crea due job Cloud Scheduler che pubblicano in un argomento Pub/Sub una volta al giorno:
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 pianificazione è specificata nel formato cron Unix. Ad esempio,
0 16 * * *significa che i job vengono eseguiti alle 16:00 (4 PM) UTC ogni giorno.Innanzitutto, verifica che tutti i trigger siano stati creati correttamente:
gcloud eventarc triggers list
L'output dovrebbe essere simile al seguente:
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-central1Recupera gli ID job Cloud Scheduler:
gcloud scheduler jobs list
L'output dovrebbe essere simile al seguente:
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 ENABLEDAnche se i job sono pianificati per essere eseguiti ogni giorno alle 16:00 e alle 17:00, puoi anche eseguirli manualmente:
gcloud scheduler jobs run cre-scheduler-cy gcloud scheduler jobs run cre-scheduler-uk
Dopo qualche minuto, verifica che nel bucket Cloud Storage siano presenti due grafici:
gcloud storage ls gs://${BUCKET}
L'output dovrebbe essere simile al seguente:
gs://BUCKET/chart-cyprus.png gs://BUCKET/chart-unitedkingdom.png
Elimina tutti i servizi Cloud Run di cui hai eseguito il deployment in questo tutorial:
gcloud run services delete SERVICE_NAME
dove
SERVICE_NAMEè il nome del servizio che hai scelto.Puoi anche eliminare i servizi Cloud Run dalla consoleGoogle Cloud .
Rimuovi tutte le configurazioni predefinite di Google Cloud CLI che hai aggiunto durante la configurazione del tutorial.
gcloud config unset project gcloud config unset run/region gcloud config unset run/platform gcloud config unset eventarc/location
Elimina tutti i trigger Eventarc che hai creato in questo tutorial:
Sostituiscigcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAMEcon il nome del trigger.Elimina le immagini da 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
Elimina il bucket e tutti gli oggetti al suo interno:
gcloud storage rm --recursive gs://${BUCKET}/Elimina i job Cloud Scheduler:
gcloud scheduler jobs delete cre-scheduler-cy gcloud scheduler jobs delete cre-scheduler-uk
Creare una chiave API SendGrid
SendGrid è un provider email basato su cloud che ti consente di inviare email senza dover gestire i server di posta.
Crea un repository Artifact Registry standard
Crea un repository standard di Artifact Registry per archiviare l'immagine container Docker:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
Sostituisci REPOSITORY con un nome univoco per il repository.
Crea un bucket Cloud Storage
Crea un bucket Cloud Storage univoco per salvare i grafici. Assicurati che il bucket e i grafici siano disponibili pubblicamente e nella stessa regione del tuo servizio 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
Esegui il deployment del servizio Notifier
Esegui il deployment di un servizio Cloud Run che riceve eventi di Chart Creator e utilizza SendGrid per inviare via email i link ai grafici generati.
Quando vedi l'URL del servizio, il deployment è completato.
Crea un trigger per il servizio Notifier
Il trigger Eventarc per il servizio Notifier di cui è stato eseguito il deployment su Cloud Run filtra i log di controllo di Cloud Storage in cui methodName è storage.objects.create.
Esegui il deployment del servizio Chart Creator
Esegui il deployment di un servizio Cloud Run che riceve eventi Query Runner, recupera i dati da una tabella BigQuery per un paese specifico e poi genera un grafico, utilizzando Matplotlib, dai dati. Il grafico viene caricato in un bucket Cloud Storage.
Quando vedi l'URL del servizio, il deployment è completato.
Crea un trigger per il servizio Chart Creator
Il trigger Eventarc per il servizio Chart Creator di cui è stato eseguito il deployment su Cloud Run filtra i messaggi pubblicati in un argomento Pub/Sub.
Esegui il deployment del servizio Query Runner
Esegui il deployment di un servizio Cloud Run che riceve eventi Cloud Scheduler, recupera i dati da un set di dati pubblico sul COVID-19 e salva i risultati in una nuova tabella BigQuery.
Quando vedi l'URL del servizio, il deployment è completato.
Crea un trigger per il servizio Query Runner
Il trigger Eventarc per il servizio Query Runner di cui è stato eseguito il deployment su Cloud Run filtra i messaggi pubblicati in un argomento Pub/Sub.
Pianifica i job
La pipeline di elaborazione viene attivata da due job Cloud Scheduler.
esegui la pipeline.
Complimenti! Dovresti ricevere anche due email con i link ai grafici.
Esegui la pulizia
Se hai creato un nuovo progetto per questo tutorial, eliminalo. Se hai utilizzato un progetto esistente e vuoi conservarlo senza le modifiche aggiunte in questo tutorial, elimina le risorse create per il tutorial.
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID