Creazione di una pipeline di elaborazione di BigQuery con Eventarc


Questo tutorial mostra come utilizzare Eventarc per creare una pipeline di elaborazione che pianifica le query su un set di dati BigQuery pubblico, genera grafici basati sui dati e condivide i link ai grafici via 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: si attiva quando i job di 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 COVID-19 pubblico e salva i risultati in una nuova tabella BigQuery.
  2. Chart Creator: si attiva 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 li salva in un bucket Cloud Storage.
  3. Notifier: attivato dagli audit log 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 utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Prima di iniziare

I vincoli di sicurezza definiti dalla tua organizzazione potrebbero impedirti di completare i passaggi seguenti. Per informazioni sulla risoluzione dei problemi, consulta la pagina Sviluppare applicazioni in un ambiente Google Cloud limitato.

  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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. Enable the Cloud Build, Cloud Logging, Cloud Run, Cloud Scheduler, Container Registry, Eventarc, Pub/Sub APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  9. Enable the Cloud Build, Cloud Logging, Cloud Run, Cloud Scheduler, Container Registry, Eventarc, Pub/Sub APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Aggiorna i componenti gcloud:
    gcloud components update
  13. Accedi utilizzando il tuo account:
    gcloud auth login
  14. Seleziona Google Cloud Storage e abilita i tipi di log Lettura amministratore, Lettura dati e Scrittura dati:

    Vai agli audit log di Cloud

  15. Concedi il ruolo eventarc.eventReceiver all'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 abilitato l'account di servizio Pub/Sub entro l'8 aprile 2021, 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 di tua scelta.

  18. Scarica e installa lo strumento di gestione del codice sorgente Git.

Creare una chiave API SendGrid

SendGrid è un provider email basato su cloud che consente di inviare email senza dover gestire server email.

  1. Accedi a SendGrid e vai a Impostazioni > Chiavi API.
  2. Fai clic su Crea chiave API.
  3. Seleziona le autorizzazioni per la chiave. Come minimo, la chiave deve disporre delle autorizzazioni di invio email per inviare email.
  4. Fai clic su Salva per creare la chiave.
  5. SendGrid genera una nuova chiave. Questa è l'unica copia della chiave, quindi assicurati di copiare la chiave e di salvarla per dopo.

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 che si trovino nella stessa regione del servizio 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}
  

Esegui il deployment del servizio Gmail

Esegui il deployment di un servizio Cloud Run che riceve eventi Chart Creator e utilizza SendGrid per inviare tramite 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 gcr.io/$(gcloud config get-value project)/${SERVICE_NAME}:v1 .
    docker push gcr.io/$(gcloud config get-value project)/${SERVICE_NAME}:v1
  3. Esegui il deployment dell'immagine container in Cloud Run, passando l'indirizzo a cui inviare 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 gcr.io/$(gcloud config get-value project)/${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 per 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, il deployment è stato completato.

Crea un trigger per il servizio Gmail

Il trigger Eventarc per il servizio Gmail di cui è stato eseguito il deployment su Cloud Run filtra per gli audit log di Cloud Storage, dove methodName è storage.objects.create.

  1. Crea l'attivatore:

    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.

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 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 gcr.io/$(gcloud config get-value project)/${SERVICE_NAME}:v1 .
    docker push gcr.io/$(gcloud config get-value project)/${SERVICE_NAME}:v1
  3. Esegui il deployment dell'immagine container in Cloud Run, passando BUCKET:

    gcloud run deploy ${SERVICE_NAME} \
        --image gcr.io/$(gcloud config get-value project)/${SERVICE_NAME}:v1 \
        --update-env-vars BUCKET=${BUCKET} \
        --allow-unauthenticated

Quando vedi l'URL del servizio, il deployment è stato completato.

Crea un attivatore per il servizio Chart Creator

Il trigger Eventarc per il servizio Chart Creator di cui è stato eseguito il deployment nei filtri Cloud Run per i messaggi pubblicati in un argomento Pub/Sub.

  1. Crea l'attivatore:

    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 gcr.io/$(gcloud config get-value project)/${SERVICE_NAME}:v1 -f bigquery/${SERVICE_NAME}/csharp/Dockerfile .
    docker push gcr.io/$(gcloud config get-value project)/${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 gcr.io/$(gcloud config get-value project)/${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, 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 nei filtri di Cloud Run per i messaggi pubblicati in un argomento Pub/Sub.

  1. Crea l'attivatore:

    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. Impostare 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 località 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 in formato Unix-cron. Ad esempio, 0 16 * * * significa che i job vengono eseguiti ogni giorno alle 16:00 (16:00) UTC.

esegui la pipeline.

  1. Innanzitutto, verifica che tutti gli attivatori siano stati creati correttamente:

    gcloud eventarc triggers list

    L'output dovrebbe essere simile al seguente:

    NAME                   TYPE                                           DESTINATION_RUN_SERVICE  DESTINATION_RUN_PATH  ACTIVE
    trigger-chart-creator  google.cloud.pubsub.topic.v1.messagePublished  chart-creator                                  Yes
    trigger-notifier       google.cloud.audit.log.v1.written              notifier                                       Yes
    trigger-query-runner   google.cloud.pubsub.topic.v1.messagePublished  query-runner                                   Yes
    
  2. Recupera gli ID job di 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. Sebbene l'esecuzione dei job sia pianificata ogni giorno alle 16:00 e alle 17:00, puoi anche eseguire i job di Cloud Scheduler manualmente:

    gcloud scheduler jobs run cre-scheduler-cy
    gcloud scheduler jobs run cre-scheduler-uk
  4. Dopo alcuni minuti, verifica che siano presenti due grafici nel bucket Cloud Storage:

    gsutil 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, elimina il progetto. Se hai utilizzato un progetto esistente e vuoi conservarlo senza le modifiche aggiunte in questo tutorial, elimina le risorse create per il tutorial.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è eliminare il progetto che hai creato per il tutorial.

Per eliminare il progetto:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Elimina risorse tutorial

  1. Elimina il servizio 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 console Google Cloud.

  2. Rimuovi tutte le configurazioni predefinite dell'interfaccia a riga di comando gcloud aggiunte durante la configurazione del tutorial.

    Ecco alcuni esempi:

    gcloud config unset run/region

    o

    gcloud config unset project

  3. Elimina le altre risorse Google Cloud create in questo tutorial:

    • Elimina il trigger Eventarc:
      gcloud eventarc triggers delete TRIGGER_NAME
      
      Sostituisci TRIGGER_NAME con il nome del tuo attivatore.

Passaggi successivi