Créer un pipeline de traitement BigQuery avec Eventarc


Ce tutoriel explique comment utiliser Eventarc pour créer un pipeline de traitement qui planifie des requêtes sur un ensemble de données BigQuery public, génère des graphiques basés sur les données et partage des liens vers les graphiques par e-mail.

Objectifs

Dans ce tutoriel, vous allez créer et déployer trois services Cloud Run qui permettent d'autoriser l'accès non authentifié et de recevoir des événements à l'aide d'Eventarc :

  1. Exécuteur de requêtes : déclenché lorsque les tâches Cloud Scheduler publient un message dans un sujet Pub/Sub, ce service extrait les données d'un ensemble de données public sur la COVID-19 à l'aide de l'API BigQuery et enregistre les résultats dans une nouvelle table BigQuery.
  2. Créateur de graphiques : déclenché lorsque le service d'exécution de requêtes publie un message dans un sujet Pub/Sub, ce service génère des graphiques à l'aide de la bibliothèque de traçage Python Matplotlib et les enregistre dans un bucket Cloud Storage.
  3. Système d'alerte : déclenché par les journaux d'audit lorsque le service de création de graphiques stocke un graphique dans un bucket Cloud Storage, ce service utilise le service de messagerie SendGrid pour envoyer des liens vers les graphiques à une adresse e-mail.

Le schéma suivant illustre l'architecture générale :

Pipeline de traitement BigQuery

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

Les contraintes de sécurité définies par votre organisation peuvent vous empêcher d'effectuer les étapes suivantes. Pour obtenir des informations de dépannage, consultez la page Développer des applications dans un environnement Google Cloud limité.

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  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. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  6. Activer les API Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Scheduler, Eventarc, and Pub/Sub :

    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. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  11. Activer les API Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Scheduler, Eventarc, and Pub/Sub :

    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. Pour Cloud Storage, activez la journalisation d'audit pour les types d'accès aux données ADMIN_READ, DATA_WRITE et DATA_READ.

    1. Lisez la stratégie IAM (Identity and Access Management) associée à votre projet, dossier ou organisation Google Cloud, et stockez-la dans un fichier temporaire :
      gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
    2. Dans un éditeur de texte, ouvrez /tmp/policy.yaml, puis ajoutez ou modifiez uniquement la configuration du journal d'audit dans la section auditConfigs :

      
        auditConfigs:
        - auditLogConfigs:
          - logType: ADMIN_READ
          - logType: DATA_WRITE
          - logType: DATA_READ
          service: storage.googleapis.com
        bindings:
        - members:
        [...]
        etag: BwW_bHKTV5U=
        version: 1

    3. Rédigez votre nouvelle stratégie IAM :

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

      Si la commande précédente signale un conflit avec une autre modification, répétez ces étapes en commençant par la lecture de la stratégie IAM. Pour en savoir plus, consultez la page Configurer les journaux d'audit pour l'accès aux données à l'aide de l'API.

  13. Attribuez le rôle eventarc.eventReceiver au compte de service 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 vous avez activé le compte de service Pub/Sub le 8 avril 2021 ou avant cette date, attribuez le rôle iam.serviceAccountTokenCreator au compte de service 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. Définissez les valeurs par défaut utilisées dans ce tutoriel :
    export REGION=REGION
    gcloud config set run/region ${REGION}
    gcloud config set run/platform managed
    gcloud config set eventarc/location ${REGION}
    

    Remplacez REGION par un emplacement Eventarc compatible de votre choix.

Créer une clé API SendGrid

SendGrid est un fournisseur de messagerie dans le cloud qui vous permet d'envoyer des e-mails, sans avoir à gérer de serveurs de messagerie.

  1. Connectez-vous à Sendgrid et accédez à Paramètres > Clés API.
  2. Cliquez sur Créer la clé API.
  3. Sélectionnez les autorisations pour la clé. La clé a besoin au minimum de l'autorisation d'envoi d'e-mails pour envoyer des e-mails.
  4. Nommez votre clé et cliquez sur Enregistrer pour la créer.
  5. SendGrid génère une nouvelle clé. Il s'agit de la seule copie de la clé. Assurez-vous de la copier et de l'enregistrer pour plus tard.

Créer un dépôt standard Artifact Registry

Créez un dépôt standard Artifact Registry pour stocker votre image de conteneur Docker :

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

Remplacez REPOSITORY par un nom unique pour le dépôt.

Créer un bucket Cloud Storage

Créez un bucket Cloud Storage pour enregistrer les graphiques. Assurez-vous que le bucket et les graphiques sont accessibles au public, et qu'ils se trouvent dans la même région que votre service Cloud Run :

export BUCKET="$(gcloud config get-value core/project)-charts"
gcloud storage buckets create gs://${BUCKET} --location=$(gcloud config get-value run/region) --uniform-bucket-level-access
gcloud storage buckets add-iam-policy-binding gs://${BUCKET} --member=allUsers --role=roles/storage.objectViewer

Déployer le système d'alerte

Déployez un service Cloud Run qui reçoit les événements du créateur de graphiques et utilise SendGrid pour envoyer des liens vers les graphiques générés par e-mail.

  1. Clonez le dépôt GitHub et accédez au répertoire notifier/python :

    git clone https://github.com/GoogleCloudPlatform/eventarc-samples
    cd eventarc-samples/processing-pipelines/bigquery/notifier/python/
    
  2. Créez et transférez l'image de conteneur :

    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. Déployez l'image de conteneur dans Cloud Run, en transmettant une adresse à laquelle envoyer des e-mails et la clé 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
    

    Remplacez les éléments suivants :

    • EMAIL_ADDRESS par une adresse e-mail à laquelle envoyer les liens vers les graphiques générés.
    • YOUR_SENDGRID_API_KEY par la clé API SendGrid que vous avez notée précédemment.

Lorsque l'URL du service s'affiche, cela signifie que le déploiement est terminé.

Créer un déclencheur pour le système d'alerte

Le déclencheur Eventarc du système d'alerte déployé sur Cloud Run filtre les journaux d'audit Cloud Storage dont methodName est storage.objects.create.

  1. Créez le déclencheur :

    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
    

    Cette action crée un déclencheur appelé trigger-notifier.

Déployer le service de création de graphiques

Déployez un service Cloud Run qui reçoit les événements de l'exécuteur de requêtes, récupère les données d'une table BigQuery pour un pays spécifique, puis génère un graphique basé sur les données à l'aide de Matplotlib. Le graphique est importé dans un bucket Cloud Storage.

  1. Accédez au répertoire chart-creator/python :

    cd ../../chart-creator/python
    
  2. Créez et transférez l'image de conteneur :

    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. Déployez l'image de conteneur dans Cloud Run, en transmettant le 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
    

Lorsque l'URL du service s'affiche, cela signifie que le déploiement est terminé.

Créer un déclencheur pour le service de création de graphiques

Le déclencheur Eventarc du service de création de graphiques déployé sur Cloud Run filtre les messages publiés dans un sujet Pub/Sub.

  1. Créez le déclencheur :

    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"
    

    Cette action crée un déclencheur appelé trigger-chart-creator.

  2. Définissez la variable d'environnement du sujet Pub/Sub.

    export TOPIC_QUERY_COMPLETED=$(basename $(gcloud eventarc triggers describe trigger-${SERVICE_NAME} --format='value(transport.pubsub.topic)'))
    

Déployer le service d'exécution de requêtes

Déployez un service Cloud Run qui reçoit les événements Cloud Scheduler, extrait les données d'un ensemble de données public sur la COVID-19 et enregistre les résultats dans une nouvelle table BigQuery.

  1. Accédez au répertoire processing-pipelines :

    cd ../../..
    
  2. Créez et transférez l'image de conteneur :

    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. Déployez l'image de conteneur dans Cloud Run, en transmettant PROJECT_ID et 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
    

Lorsque l'URL du service s'affiche, cela signifie que le déploiement est terminé.

Créer un déclencheur pour le service d'exécution de requêtes

Le déclencheur Eventarc du service d'exécution de requêtes déployé sur Cloud Run filtre les messages publiés dans un sujet Pub/Sub.

  1. Créez le déclencheur :

    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"
    

    Cette action crée un déclencheur appelé trigger-query-runner.

  2. Définissez une variable d'environnement pour le sujet Pub/Sub.

    export TOPIC_QUERY_SCHEDULED=$(gcloud eventarc triggers describe trigger-${SERVICE_NAME} --format='value(transport.pubsub.topic)')
    

Planifier les tâches

Le pipeline de traitement est déclenché par deux tâches Cloud Scheduler.

  1. Créez une application App Engine requise par Cloud Scheduler et spécifiez un emplacement approprié :

    export APP_ENGINE_LOCATION=LOCATION
    gcloud app create --region=${APP_ENGINE_LOCATION}
    
  2. Créez deux tâches Cloud Scheduler qui publient un sujet Pub/Sub une fois par jour :

    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 planification est spécifiée au format unix-cron. Par exemple, 0 16 * * * signifie que les tâches s'exécutent tous les jours à 16:00 UTC.

Exécuter le pipeline

  1. Tout d'abord, vérifiez que tous les déclencheurs ont bien été créés :

    gcloud eventarc triggers list
    

    La sortie devrait ressembler à ce qui suit :

    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. Récupérez les ID de tâches Cloud Scheduler :

    gcloud scheduler jobs list
    

    La sortie devrait ressembler à ce qui suit :

    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. Bien que l'exécution des tâches soit planifiée tous les jours à 16h et 17h, vous pouvez également les exécuter manuellement :

    gcloud scheduler jobs run cre-scheduler-cy
    gcloud scheduler jobs run cre-scheduler-uk
    
  4. Au bout de quelques minutes, vérifiez que le bucket Cloud Storage contient deux graphiques :

    gcloud storage ls gs://${BUCKET}
    

    La sortie devrait ressembler à ce qui suit :

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

Félicitations ! Vous devez également recevoir deux e-mails contenant les liens vers les graphiques.

Effectuer un nettoyage

Si vous avez créé un projet pour ce tutoriel, supprimez-le. Si vous avez utilisé un projet existant et que vous souhaitez le conserver sans les modifications du présent tutoriel, supprimez les ressources créées pour ce tutoriel.

    Supprimez un projet Google Cloud :

    gcloud projects delete PROJECT_ID

Supprimer les ressources du tutoriel

  1. Supprimez les services Cloud Run que vous avez déployés dans ce tutoriel :

    gcloud run services delete SERVICE_NAME

    SERVICE_NAME est le nom de service que vous avez choisi.

    Vous pouvez également supprimer des services Cloud Run à partir de Google Cloud Console.

  2. Supprimez toute configuration par défaut de Google Cloud CLI que vous avez ajoutée lors de la configuration du tutoriel.

    gcloud config unset project
    gcloud config unset run/region
    gcloud config unset run/platform
    gcloud config unset eventarc/location
    
  3. Supprimez tous les déclencheurs Eventarc que vous avez créés dans ce tutoriel :

     gcloud eventarc triggers delete TRIGGER_NAME
     
    Remplacez TRIGGER_NAME par le nom de votre déclencheur.

  4. Supprimez les images d'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. Supprimez le bucket, ainsi que tous les objets qu'il contient :

    gcloud storage rm --recursive gs://${BUCKET}/
  6. Supprimez les jobs Cloud Scheduler :

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

Étapes suivantes