Creazione di una pipeline di elaborazione di BigQuery con Eventarc

Questo tutorial mostra come utilizzare Eventarc per creare una pipeline di elaborazione che pianifica query su un set di dati BigQuery pubblico, genera grafici basati sui 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:

  1. 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.
  2. 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.
  3. 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:

Pipeline di elaborazione BigQuery

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.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova senza costi.

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.

  1. Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
  2. Installa Google Cloud CLI.

  3. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  4. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  5. Crea o seleziona un Google Cloud progetto.

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Creare un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  6. Verifica che la fatturazione sia abilitata per il tuo progetto Google Cloud .

  7. Abilita le API Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Scheduler, Eventarc e Pub/Sub:

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin), che include l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

    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. Installa Google Cloud CLI.

  9. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  10. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  11. Crea o seleziona un Google Cloud progetto.

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Creare un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  12. Verifica che la fatturazione sia abilitata per il tuo progetto Google Cloud .

  13. Abilita le API Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Scheduler, Eventarc e Pub/Sub:

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin), che include l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

    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. Per Cloud Storage, abilita l'audit logging per i tipi di accesso ai dati ADMIN_READ, DATA_WRITE e DATA_READ.

    1. 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
    2. In un editor di testo, apri /tmp/policy.yaml e aggiungi o modifica solo la configurazione del log di controllo nella sezione auditConfigs:

      
        auditConfigs:
        - auditLogConfigs:
          - logType: ADMIN_READ
          - logType: DATA_WRITE
          - logType: DATA_READ
          service: storage.googleapis.com
        bindings:
        - members:
        [...]
        etag: BwW_bHKTV5U=
        version: 1
    3. 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.

  15. Concedi il ruolo eventarc.eventReceiver al 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'

  16. Se hai attivato l'account di servizio Pub/Sub l'8 aprile 2021 o in una data precedente, concedi il ruolo iam.serviceAccountTokenCreator all'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'

  17. 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 REGION con la località Eventarc supportata che preferisci.

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.

  1. Accedi a SendGrid e vai a Impostazioni > Chiavi API.
  2. Fai clic su Crea chiave API.
  3. Seleziona le autorizzazioni per la chiave. Per inviare email, la chiave deve disporre come minimo delle autorizzazioni per l'invio di email.
  4. Assegna un nome alla chiave e fai clic su Salva per crearla.
  5. SendGrid genera una nuova chiave. Si tratta dell'unica copia della chiave, quindi assicurati di copiarla e salvarla per utilizzarla in un secondo momento.

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.

  1. 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/
  2. 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
  3. 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_ADDRESS con un indirizzo email a cui inviare i link ai grafici generati
    • YOUR_SENDGRID_API_KEY con la chiave API SendGrid che hai annotato in precedenza

Quando vedi l'URL del servizio, significa che il deployment è stato 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 gli audit log di Cloud Storage in cui methodName è storage.objects.create.

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

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.

  1. Passa alla directory chart-creator/python:

    cd ../../chart-creator/python
  2. 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
  3. Esegui il deployment dell'immagine container in 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

Quando vedi l'URL del servizio, significa che il deployment è stato 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.

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

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

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.

  1. Passa alla directory processing-pipelines:

    cd ../../..
  2. 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
  3. Esegui il deployment dell'immagine container in Cloud Run, passando PROJECT_ID e 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

Quando vedi l'URL del servizio, significa che il deployment è stato 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.

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

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

Pianifica i job

La pipeline di elaborazione viene attivata da due job Cloud Scheduler.

  1. 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}
  2. 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 di Unix. Ad esempio, 0 16 * * * significa che i job vengono eseguiti alle 16:00 (4 PM) UTC ogni giorno.

esegui la pipeline.

  1. 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-central1
    
  2. Recupera 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      ENABLED
    
  3. Anche 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
  4. 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
    

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.

    Elimina un progetto Google Cloud :

    gcloud projects delete PROJECT_ID

Elimina le risorse del tutorial

  1. 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 eliminare i servizi Cloud Run anche dalla consoleGoogle Cloud .

  2. Rimuovi 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
  3. Elimina tutti i trigger Eventarc che hai creato in questo tutorial:

     gcloud eventarc triggers delete TRIGGER_NAME
     
    Sostituisci TRIGGER_NAME con il nome del trigger.

  4. 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
  5. Elimina il bucket e tutti gli oggetti al suo interno:

    gcloud storage rm --recursive gs://${BUCKET}/
  6. Elimina i job Cloud Scheduler:

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

Passaggi successivi