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.
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.
- Melden Sie sich bei SendGrid an und rufen Sie Einstellungen > API-Schlüssel auf.
- Klicken Sie auf API-Schlüssel erstellen.
- 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.
- Klicken Sie auf Save, um den Schlüssel zu erstellen.
- 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.
GKE-Cluster erstellen
Erstellen Sie einen Cluster mit aktivierter Identitätsföderation von Arbeitslasten für GKE, damit er über Anwendungen, die in GKE ausgeführt werden, auf Google Cloud Dienste zugreifen kann. Sie benötigen außerdem die Identitätsföderation von Arbeitslasten für GKE, um Ereignisse mithilfe von Eventarc weiterzuleiten.
Erstellen Sie einen GKE-Cluster für Knative Serving mit den aktivierten Add-ons
CloudRun
,HttpLoadBalancing
undHorizontalPodAutoscaling
:gcloud beta container clusters create $CLUSTER_NAME \ --addons=HttpLoadBalancing,HorizontalPodAutoscaling,CloudRun \ --machine-type=n1-standard-4 \ --enable-autoscaling --min-nodes=2 --max-nodes=10 \ --no-issue-client-certificate --num-nodes=2 \ --logging=SYSTEM,WORKLOAD \ --monitoring=SYSTEM \ --scopes=cloud-platform,logging-write,monitoring-write,pubsub \ --zone us-central1 \ --release-channel=rapid \ --workload-pool=$PROJECT_ID.svc.id.goog
Warten Sie einige Minuten, bis der Cluster erstellt ist. Während dem Prozess werden möglicherweise Warnmeldungen angezeigt, die Sie ignorieren können. Wenn der Cluster erstellt wurde, sieht die Ausgabe in etwa so aus:
Creating cluster ...done. Created [https://container.googleapis.com/v1beta1/projects/my-project/zones/us-central1/clusters/events-cluster].
Erstellen Sie ein Artifact Registry-Standard-Repository zum Speichern des Docker-Container-Images:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$CLUSTER_LOCATION
Ersetzen Sie
REPOSITORY
durch einen eindeutigen Namen für das Repository.
GKE-Dienstkonto konfigurieren
Konfigurieren Sie ein GKE-Dienstkonto, das als Standarddienstkonto für Compute fungieren soll.
Erstellen Sie eine IAM-Bindung (Identitäts- und Zugriffsverwaltung) zwischen den Dienstkonten:
PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')" gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[default/default]" \ $PROJECT_NUMBER-compute@developer.gserviceaccount.com
Fügen Sie dem GKE-Dienstkonto unter Verwendung der E-Mail-Adresse des Compute-Dienstkontos die Annotation
iam.gke.io/gcp-service-account
hinzu:kubectl annotate serviceaccount \ --namespace default \ default \ iam.gke.io/gcp-service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
GKE-Ziele aktivieren
Damit Eventarc Ressourcen im GKE-Cluster verwalten kann, aktivieren Sie GKE-Ziele und binden Sie das Eventarc-Dienstkonto an die erforderlichen Rollen.
Aktivieren Sie GKE-Ziele für Eventarc:
gcloud eventarc gke-destinations init
Geben Sie bei der Aufforderung, die erforderlichen Rollen zu binden,
y
ein.Die folgenden Rollen sind gebunden:
roles/compute.viewer
roles/container.developer
roles/iam.serviceAccountAdmin
Dienstkonto erstellen und Rollen für den Bindungszugriff erstellen
Bevor Sie den Eventarc-Trigger erstellen, richten Sie ein vom Nutzer verwaltetes Dienstkonto ein und weisen Sie ihm bestimmte Rollen zu, damit Eventarc Pub/Sub-Ereignisse weiterleiten kann.
Erstellen Sie ein Dienstkonto mit dem Namen
TRIGGER_GSA
:TRIGGER_GSA=eventarc-bigquery-triggers gcloud iam service-accounts create $TRIGGER_GSA
Weisen Sie dem Dienstkonto die Rollen
pubsub.subscriber
,monitoring.metricWriter
undeventarc.eventReceiver
zu:PROJECT_ID=$(gcloud config get-value project) gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/pubsub.subscriber" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/monitoring.metricWriter" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/eventarc.eventReceiver"
Cloud Storage-Bucket erstellen
Erstellen Sie einen 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 GKE-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
Repository klonen
GitHub-Repository klonen.
git clone https://github.com/GoogleCloudPlatform/eventarc-samples cd eventarc-samples/processing-pipelines
Notifier-Dienst bereitstellen
Stellen Sie im Verzeichnis bigquery/notifier/python
einen Knative-Serving-Dienst bereit, der Diagrammerstellerereignisse empfängt und SendGrid verwendet, um Links zu den generierten Diagrammen zu senden.
Erstellen Sie das Container-Image und übertragen Sie es per Push:
pushd bigquery/notifier/python export SERVICE_NAME=notifier docker build -t $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 . docker push $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 popd
Stellen Sie das Container-Image für Knative serving 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 $CLUSTER_LOCATION-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}
Ersetzen Sie dabei Folgendes:
EMAIL_ADDRESS
: eine E-Mail-Adresse, um die Links zu den generierten Diagrammen zu sendenYOUR_SENDGRID_API_KEY
: der zuvor notierte 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 Knative serving bereitgestellt wird, filtert nach Cloud Storage-Audit-Logs, wobei der Methodenname storage.objects.create
lautet.
Erstellen Sie den Trigger:
gcloud eventarc triggers create trigger-${SERVICE_NAME}-gke \ --destination-gke-cluster=$CLUSTER_NAME \ --destination-gke-location=$CLUSTER_LOCATION \ --destination-gke-namespace=default \ --destination-gke-service=$SERVICE_NAME \ --destination-gke-path=/ \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
Dadurch wird ein Trigger mit dem Namen
trigger-notifier-gke
erstellt.
Chart Creator-Dienst bereitstellen
Stellen Sie im Verzeichnis bigquery/chart-creator/python
einen Knative-Serving-Dienst bereit, der Abfrage-Runner-Ereignisse empfängt, Daten aus einer BigQuery-Tabelle für ein bestimmtes Land abruft und dann mithilfe von Matplotlib ein Diagramm aus den Daten erstellt. Das Diagramm wird in einen Cloud Storage-Bucket hochgeladen.
Erstellen Sie das Container-Image und übertragen Sie es per Push:
pushd bigquery/chart-creator/python export SERVICE_NAME=chart-creator docker build -t $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 . docker push $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 popd
Stellen Sie das Container-Image für Knative Serving bereit und übergeben Sie
BUCKET
:gcloud run deploy ${SERVICE_NAME} \ --image $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \ --update-env-vars BUCKET=${BUCKET}
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 Knative serving bereitgestellt wird, filtert nach Nachrichten, die in einem Pub/Sub-Thema veröffentlicht wurden.
Erstellen Sie den Trigger:
gcloud eventarc triggers create trigger-${SERVICE_NAME}-gke \ --destination-gke-cluster=$CLUSTER_NAME \ --destination-gke-location=$CLUSTER_LOCATION \ --destination-gke-namespace=default \ --destination-gke-service=$SERVICE_NAME \ --destination-gke-path=/ \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
Dadurch wird ein Trigger mit dem Namen
trigger-chart-creator-gke
erstellt.Legen Sie die Umgebungsvariable für das Pub/Sub-Thema fest.
export TOPIC_QUERY_COMPLETED=$(basename $(gcloud eventarc triggers describe trigger-${SERVICE_NAME}-gke --format='value(transport.pubsub.topic)'))
Query Runner-Dienst bereitstellen
Stellen Sie im Verzeichnis processing-pipelines
einen Knative Serving-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.
Erstellen Sie das Container-Image und übertragen Sie es per Push:
export SERVICE_NAME=query-runner docker build -t $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 -f Dockerfile . docker push $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
Stellen Sie das Container-Image für Knative Serving bereit und übergeben Sie
PROJECT_ID
undTOPIC_QUERY_COMPLETED
:gcloud run deploy ${SERVICE_NAME} \ --image $CLUSTER_LOCATION-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}
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 Knative serving bereitgestellt wird, filtert nach Nachrichten, die in einem Pub/Sub-Thema veröffentlicht wurden.
Erstellen Sie den Trigger:
gcloud eventarc triggers create trigger-${SERVICE_NAME}-gke \ --destination-gke-cluster=$CLUSTER_NAME \ --destination-gke-location=$CLUSTER_LOCATION \ --destination-gke-namespace=default \ --destination-gke-service=$SERVICE_NAME \ --destination-gke-path=/ \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
Dadurch wird ein Trigger mit dem Namen
trigger-query-runner-gke
erstellt.Legen Sie eine Umgebungsvariable für das Pub/Sub-Thema fest.
export TOPIC_QUERY_SCHEDULED=$(gcloud eventarc triggers describe trigger-${SERVICE_NAME}-gke --format='value(transport.pubsub.topic)')
Jobs planen
Die Verarbeitungspipeline wird durch zwei Cloud Scheduler-Jobs ausgelöst.
Erstellen Sie eine App Engine-Anwendung, die für Cloud Scheduler erforderlich ist, und geben Sie einen geeigneten Speicherort an (z. B.
europe-west
):export APP_ENGINE_LOCATION=LOCATION gcloud app create --region=${APP_ENGINE_LOCATION}
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
Prüfen Sie, ob alle Trigger erfolgreich erstellt wurden:
gcloud eventarc triggers list
Die Ausgabe sollte in etwa so aussehen:
NAME TYPE DESTINATION ACTIVE LOCATION trigger-chart-creator-gke google.cloud.pubsub.topic.v1.messagePublished GKE:chart-creator Yes us-central1 trigger-notifier-gke google.cloud.audit.log.v1.written GKE:notifier Yes us-central1 trigger-query-runner-gke google.cloud.pubsub.topic.v1.messagePublished GKE:query-runner Yes us-central1
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
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
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://PROJECT_ID-charts/chart-cyprus.png gs://PROJECT_ID-charts/chart-unitedkingdom.png
Glückwunsch! Sie sollten außerdem zwei E-Mails mit Links zu den Diagrammen erhalten.