BigQuery-Verarbeitungspipeline mit Eventarc erstellen


In dieser Anleitung erfahren Sie, wie Sie mit Eventarc eine Verarbeitungspipeline erstellen, die Abfragen an ein öffentliches BigQuery-Dataset plant, Diagramme anhand der Daten generiert und Links zu den Diagrammen per E-Mail sendet.

Ziele

In dieser Anleitung werden Sie drei Cloud Run-Dienste erstellen und bereitstellen, die nicht authentifizierten Zugriff zulassen und Ereignisse über Eventarc empfangen:

  1. Query Runner: Wird ausgelöst, wenn Cloud Scheduler-Jobs eine Nachricht in einem Pub/Sub-Thema veröffentlichen. Dieser Dienst verwendet die BigQuery API, um Daten aus einem öffentlichen COVID-19-Dataset abzurufen, und speichert die Ergebnisse in einer neuen BigQuery-Tabelle.
  2. Chart Creator: Wird ausgelöst, wenn der Query Runner-Dienst eine Nachricht in einem Pub/Sub-Thema veröffentlicht. Dieser Dienst generiert Diagramme über die Python-Plot-Bibliothek Matplotlib und speichert sie in einem Cloud Storage-Bucket.
  3. Notifier: Wird von Audit-Logs ausgelöst, wenn der Chart Creator-Dienst ein Diagramm in einem Cloud Storage-Bucket speichert. Dieser Dienst verwendet den E-Mail-Dienst SendGrid, um Links zu den Diagrammen an eine E-Mail-Adresse zu senden.

Im folgenden Diagramm ist die allgemeine Architektur dargestellt:

Grafik: BigQuery-Verarbeitungspipeline

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.

Neuen Google Cloud Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweise

Von Ihrer Organisation definierte Sicherheitsbeschränkungen verhindern möglicherweise, dass die folgenden Schritte ausgeführt werden. Informationen zur Fehlerbehebung finden Sie unter Anwendungen in einer eingeschränkten Google Cloud -Umgebung entwickeln.

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

  3. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  4. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  5. 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 the resourcemanager.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.

  6. Verify that billing is enabled for your Google Cloud project.

  7. 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 the serviceusage.services.enable permission. 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
  8. Install the Google Cloud CLI.

  9. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  10. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  11. 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 the resourcemanager.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.

  12. Verify that billing is enabled for your Google Cloud project.

  13. 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 the serviceusage.services.enable permission. 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
  14. Aktivieren Sie für Cloud Storage das Audit-Logging für die Datenzugriffstypen ADMIN_READ, DATA_WRITE und DATA_READ.

    1. Lesen Sie die IAM-Richtlinie (Identity and Access Management), die Ihrem Google Cloud -Projekt, -Ordner oder -Organisation zugeordnet ist, und speichern Sie sie in einer temporären Datei:
      gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
    2. Öffnen Sie /tmp/policy.yaml in einem Texteditor und fügen Sie nur die Konfiguration des Audit-Logs im Abschnitt auditConfigs hinzu oder ändern Sie sie:

      
        auditConfigs:
        - auditLogConfigs:
          - logType: ADMIN_READ
          - logType: DATA_WRITE
          - logType: DATA_READ
          service: storage.googleapis.com
        bindings:
        - members:
        [...]
        etag: BwW_bHKTV5U=
        version: 1
    3. Schreiben Sie die neue IAM-Richtlinie:

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

      Wenn der vorhergehende Befehl einen Konflikt mit einer anderen Änderung meldet, wiederholen Sie diese Schritte, beginnend mit dem Lesen der IAM-Richtlinie. Weitere Informationen finden Sie unter Audit-Logs zum Datenzugriff mit der API konfigurieren.

  15. Weisen Sie dem Compute Engine-Dienstkonto die Rolle eventarc.eventReceiver zu:

    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. Wenn Sie das Pub/Sub-Dienstkonto am oder vor dem 8. April 2021 aktiviert haben, weisen Sie dem Pub/Sub-Dienstkonto die Rolle iam.serviceAccountTokenCreator zu:

    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. Legen Sie die in dieser Anleitung verwendeten Standardwerte fest:
    export REGION=REGION
    gcloud config set run/region ${REGION}
    gcloud config set run/platform managed
    gcloud config set eventarc/location ${REGION}

    Ersetzen Sie REGION durch den unterstützten Eventarc-Standort Ihrer Wahl.

  18. SendGrid API-Schlüssel erstellen

    SendGrid ist ein cloudbasierter E-Mail-Anbieter, mit dem Sie E-Mails senden können, ohne E-Mail-Server verwalten zu müssen.

    1. Melden Sie sich bei SendGrid an und rufen Sie Einstellungen > API-Schlüssel auf.
    2. Klicken Sie auf API-Schlüssel erstellen.
    3. Wählen Sie die Berechtigungen für den Schlüssel aus. Der Schlüssel muss mindestens die Berechtigungen E-Mails senden zum Senden von E-Mails haben.
    4. Geben Sie einen Namen für den Schlüssel ein und klicken Sie auf Speichern, um den Schlüssel zu erstellen.
    5. SendGrid generiert einen neuen Schlüssel. Dies ist die einzige Kopie des Schlüssels. Kopieren Sie den Schlüssel daher und speichern Sie ihn für später.

    Artifact Registry-Standard-Repository erstellen

    Erstellen Sie ein Artifact Registry-Standard-Repository zum Speichern des Docker-Container-Images:

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

    Ersetzen Sie REPOSITORY durch einen eindeutigen Namen für das Repository.

    Cloud Storage-Bucket erstellen

    Erstellen Sie einen eindeutigen Cloud Storage-Bucket zum Speichern der Diagramme. Achten Sie darauf, dass der Bucket und die Diagramme öffentlich verfügbar sind und sich in derselben Region wie Ihr Cloud Run-Dienst befinden:

    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

    Notifier-Dienst bereitstellen

    Stellen Sie einen Cloud Run-Dienst bereit, der Chart Creator-Ereignisse empfängt und mithilfe von SendGrid Links zu den generierten Diagrammen per E-Mail sendet.

    1. Klonen Sie das GitHub-Repository und wechseln Sie in das Verzeichnis notifier/python:

      git clone https://github.com/GoogleCloudPlatform/eventarc-samples
      cd eventarc-samples/processing-pipelines/bigquery/notifier/python/
    2. Erstellen Sie das Container-Image und übertragen Sie es per Push:

      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. Stellen Sie das Container-Image für Cloud Run bereit und übergeben Sie eine Adresse, an die E-Mails gesendet werden sollen, sowie den SendGrid API-Schlüssel an:

      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

      Ersetzen Sie dabei Folgendes:

      • EMAIL_ADDRESS durch eine E-Mail-Adresse, um die Links zu den generierten Diagrammen zu senden
      • YOUR_SENDGRID_API_KEY durch den zuvor notierten SendGrid API-Schlüssel

    Wenn die Dienst-URL angezeigt wird, wurde sie erfolgreich bereitgestellt.

    Trigger für den Notifier-Dienst erstellen

    Der Eventarc-Trigger für den Notifier-Dienst, der in Cloud Run bereitgestellt wird, filtert nach Cloud Storage-Audit-Logs, wobei der methodName "storage.objects.create" lautet.

    1. Erstellen Sie den 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

      Dadurch wird ein Trigger mit dem Namen trigger-notifier erstellt.

    Chart Creator-Dienst bereitstellen

    Stellen Sie einen Cloud Run-Dienst bereit, der Query Runner-Ereignisse empfängt, Daten aus einer BigQuery-Tabelle für ein bestimmtes Land abruft und dann mithilfe von Matplotlib aus den Daten ein Diagramm generiert. Das Diagramm wird in einen Cloud Storage-Bucket hochgeladen.

    1. Wechseln Sie in das Verzeichnis chart-creator/python:

      cd ../../chart-creator/python
    2. Erstellen Sie das Container-Image und übertragen Sie es per Push:

      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. Stellen Sie das Container-Image für Cloud Run bereit und übergeben Sie 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

    Wenn die Dienst-URL angezeigt wird, wurde sie erfolgreich bereitgestellt.

    Trigger für den Chart Creator-Dienst erstellen

    Der Eventarc-Trigger für den Chart Creator-Dienst, der in Cloud Run bereitgestellt wird, filtert nach Nachrichten, die in einem Pub/Sub-Thema veröffentlicht wurden.

    1. Erstellen Sie den 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"

      Dadurch wird ein Trigger mit dem Namen trigger-chart-creator erstellt.

    2. Legen Sie die Umgebungsvariable für das Pub/Sub-Thema fest.

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

    Query Runner-Dienst bereitstellen

    Stellen Sie deinen Cloud Run-Dienst bereit, der Cloud Scheduler-Ereignisse empfängt, Daten aus einem öffentlichen COVID-19-Dataset abruft und die Ergebnisse in einer neuen BigQuery-Tabelle speichert.

    1. Wechseln Sie in das Verzeichnis processing-pipelines:

      cd ../../..
    2. Erstellen Sie das Container-Image und übertragen Sie es per Push:

      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. Stellen Sie das Container-Image für Cloud Run bereit und übergeben Sie PROJECT_ID und 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

    Wenn die Dienst-URL angezeigt wird, wurde sie erfolgreich bereitgestellt.

    Trigger für den Query Runner-Dienst erstellen

    Der Eventarc-Trigger für den Query Runner-Dienst, der in Cloud Run bereitgestellt wird, filtert nach Nachrichten, die in einem Pub/Sub-Thema veröffentlicht wurden.

    1. Erstellen Sie den 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"

      Dadurch wird ein Trigger mit dem Namen trigger-query-runner erstellt.

    2. Legen Sie eine Umgebungsvariable für das Pub/Sub-Thema fest.

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

    Jobs planen

    Die Verarbeitungspipeline wird durch zwei Cloud Scheduler-Jobs ausgelöst.

    1. Erstellen Sie eine App Engine-Anwendung, die für Cloud Scheduler erforderlich ist, und geben Sie einen geeigneten Standort an:

      export APP_ENGINE_LOCATION=LOCATION
      gcloud app create --region=${APP_ENGINE_LOCATION}
    2. Erstellen Sie zwei Cloud Scheduler-Jobs, die einmal täglich Veröffentlichungen an ein Pub/Sub-Thema senden:

      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"

      Der Zeitplan wird im unix-cron-Format angegeben. 0 16 * * * bedeutet beispielsweise, dass die Jobs täglich um 16:00 Uhr (UTC) ausgeführt werden.

    Pipeline ausführen

    1. Prüfen Sie zuerst, ob alle Trigger erfolgreich erstellt wurden:

      gcloud eventarc triggers list

      Die Ausgabe sollte in etwa so aussehen:

      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. Rufen Sie die Cloud Scheduler-Job-IDs ab:

      gcloud scheduler jobs list

      Die Ausgabe sollte in etwa so aussehen:

      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. Die Jobs werden zwar täglich um 16 und 17 Uhr ausgeführt, aber Sie können Sie auch manuell ausführen:

      gcloud scheduler jobs run cre-scheduler-cy
      gcloud scheduler jobs run cre-scheduler-uk
    4. Prüfen Sie nach einigen Minuten, ob sich im Cloud Storage-Bucket zwei Diagramme befinden:

      gcloud storage ls gs://${BUCKET}

      Die Ausgabe sollte in etwa so aussehen:

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

    Glückwunsch! Sie sollten außerdem zwei E-Mails mit Links zu den Diagrammen erhalten.

    Bereinigen

    Wenn Sie ein neues Projekt für diese Anleitung erstellt haben, löschen Sie das Projekt. Wenn Sie ein vorhandenes Projekt verwendet haben und es beibehalten möchten, ohne die Änderungen in dieser Anleitung hinzuzufügen, löschen Sie die für die Anleitung erstellten Ressourcen.

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Anleitungsressourcen löschen

    1. Löschen Sie die Cloud Run-Dienste, den Sie in dieser Anleitung bereitgestellt haben:

      gcloud run services delete SERVICE_NAME

      Dabei ist SERVICE_NAME der von Ihnen ausgewählte Dienstname.

      Sie können Cloud Run-Dienste auch über die Google Cloud Console löschen.

    2. Entfernen Sie alle Google Cloud CLI-Standardkonfigurationen, die Sie während der Einrichtung der Anleitung hinzugefügt haben.

      gcloud config unset project
      gcloud config unset run/region
      gcloud config unset run/platform
      gcloud config unset eventarc/location
    3. Löschen Sie alle Eventarc-Trigger, die Sie in dieser Anleitung erstellt haben:

       gcloud eventarc triggers delete TRIGGER_NAME
       
      Ersetzen Sie TRIGGER_NAME durch den Namen des Triggers.

    4. Löschen Sie die Images aus 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. Löschen Sie den Bucket zusammen mit allen Objekten im Bucket:

      gcloud storage rm --recursive gs://${BUCKET}/
    6. Löschen Sie die Cloud Scheduler-Jobs:

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

    Nächste Schritte