本教程介绍如何使用 Eventarc 构建处理流水线,该流水线安排对公共 BigQuery 数据集的查询,根据数据生成图表,并通过电子邮件分享图表链接。
目标
在本教程中,您将构建和部署在 Google Kubernetes Engine (GKE) 集群中运行并使用 Eventarc 接收事件的三个 Cloud Run for Anthos 服务:
- Query Runner - 当 Cloud Scheduler 作业向 Pub/Sub 主题发布消息时触发,此服务使用 BigQuery API 从公共 COVID-19 数据集中检索数据,并将结果保存到新的 BigQuery 表中。
- Chart Creator - 在 Query Runner 服务向 Pub/Sub 主题发布消息时触发,此服务使用 Python 绘图库 Matplotlib 生成图表,并将图表保存到 Cloud Storage 存储桶。
- Notifier - 当 Chart Creator 服务将图表存储在 Cloud Storage 存储桶中时,由审核日志触发,此服务使用电子邮件服务 SendGrid,将图表的链接发送到某个电子邮件地址。
下图展示了高级别的基础架构:
费用
本教程使用 Google Cloud 的以下收费组件:
准备工作
- 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
-
启用 Cloud Build, Cloud Logging, Cloud Run for Anthos, Cloud Scheduler, Container Registry, Eventarc, GKE, Pub/Sub, and Resource Manager API。
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
-
启用 Cloud Build, Cloud Logging, Cloud Run for Anthos, Cloud Scheduler, Container Registry, Eventarc, GKE, Pub/Sub, and Resource Manager API。
- 安装并初始化 Google Cloud CLI。
- 更新 gcloud 组件:
gcloud components update
- 使用您的帐号登录:
gcloud auth login
- 选择 Google Cloud Storage 并启用管理员读取、数据读取和数据写入日志类型: 转到 Cloud Audit Logs
- 设置本教程中使用的默认值:
CLUSTER_NAME=events-cluster CLUSTER_LOCATION=us-central1 PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID gcloud config set run/region $CLUSTER_LOCATION gcloud config set run/cluster $CLUSTER_NAME gcloud config set run/cluster_location $CLUSTER_LOCATION gcloud config set run/platform gke gcloud config set eventarc/location $CLUSTER_LOCATION
将 PROJECT_ID 替换为项目 ID。 - 下载并安装 Git 源代码管理工具。
创建 SendGrid API 密钥
SendGrid 是云端电子邮件服务提供商,让您无需维护电子邮件服务器即可发送电子邮件。
- 登录到 SendGrid 并转到 Settings > API Keys。
- 点击 Create API Key。
- 为该密钥选择权限。该密钥必须至少具有 Mail Send 权限才能发送电子邮件。
- 点击保存以创建密钥。
- SendGrid 会生成一个新的密钥。这是该密钥的唯一副本,因此请务必复制并保存该密钥以供日后使用。
为 Cloud Run for Anthos 创建 GKE 集群
创建一个启用了 Workload Identity 的集群,以便它可以从在 GKE 中运行的应用访问 Google Cloud 服务。还需要有 Workload Identity 才能使用 Eventarc 转发事件。
创建启用了
CloudRun
、HttpLoadBalancing
和HorizontalPodAutoscaling
插件为 Cloud Run for Anthos 的 GKE 集群。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
等待几分钟,让创建集群的过程完成。在该过程中,您可能会看到一些可以放心忽略的警告。创建集群后,输出类似于以下内容:
Creating cluster ...done. Created [https://container.googleapis.com/v1beta1/projects/my-project/zones/us-central1/clusters/my-cluster].
配置 GKE 服务帐号
配置 GKE 服务帐号以充当默认计算服务帐号。
在服务帐号之间创建 Identity and Access Management (IAM) 绑定:
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
使用计算服务帐号的电子邮件地址将
iam.gke.io/gcp-service-account
注解添加到 GKE 服务帐号:kubectl annotate serviceaccount \ --namespace default \ default \ iam.gke.io/gcp-service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
启用 GKE 目标
如需允许 Eventarc 管理 GKE 集群中的资源,请启用 GKE 目标,并将 Eventarc 服务帐号绑定到所需的角色。
为 Eventarc 启用 GKE 目标:
gcloud eventarc gke-destinations init
在系统提示绑定所需角色时,输入
y
。绑定以下角色:
roles/compute.viewer
roles/container.developer
roles/iam.serviceAccountAdmin
创建服务帐号和绑定访问角色
在创建 Eventarc 触发器之前,请先设置用户管理的服务帐号,并为其授予特定的角色,以便 Eventarc 可以转发 Pub/Sub 事件。
创建名为
TRIGGER_GSA
的服务帐号:TRIGGER_GSA=eventarc-bigquery-triggers gcloud iam service-accounts create $TRIGGER_GSA
向该服务帐号授予
pubsub.subscriber
、monitoring.metricWriter
和eventarc.eventReceiver
角色: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 存储桶
创建一个 Cloud Storage 存储桶以保存图表。确保存储桶和图表是公开提供的,并且与 Cloud Run for Anthos 服务位于同一区域:
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}
克隆存储库
克隆 GitHub 代码库。
git clone https://github.com/GoogleCloudPlatform/eventarc-samples cd eventarc-samples/processing-pipelines
部署通知程序服务
在 bigquery/notifier/python
目录中,部署一项 Cloud Run for Anthos 服务,用于接收图表创建程序事件并使用 SendGrid 通过电子邮件发送指向所生成图表的链接。
构建并推送容器映像:
pushd bigquery/notifier/python 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 popd
将容器映像部署到 Cloud Run for Anthos,并传入电子邮件发送到的地址以及 SendGrid API 密钥:
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}
替换以下内容:
- 将 EMAIL_ADDRESS 替换为生成的图表的链接发送到的电子邮件地址
- 将 YOUR_SENDGRID_API_KEY 替换为您之前记下的 SendGrid API 密钥
当您看到服务网址时,表示部署完成。
为通知程序服务创建触发器
部署在 Cloud Run for Anthos 上的通知程序服务的 Eventarc 触发器过滤 methodName 为 storage.objects.create
的 Cloud Storage 审核日志。
创建触发器:
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
这将创建一个名为
trigger-notifier-gke
的触发器。
部署图表创建程序服务
在 bigquery/chart-creator/python
目录中,部署 Cloud Run for Anthos 服务,该服务接收查询运行程序事件,从特定国家/地区的 BigQuery 表中检索数据,然后使用 Matplotlib 通过数据生成图表。图表将上传到 Cloud Storage 存储桶。
构建并推送容器映像:
pushd bigquery/chart-creator/python 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 popd
将容器映像部署到 Cloud Run for Anthos 并传入
BUCKET
:gcloud run deploy ${SERVICE_NAME} \ --image gcr.io/$(gcloud config get-value project)/${SERVICE_NAME}:v1 \ --update-env-vars BUCKET=${BUCKET}
当您看到服务网址时,表示部署完成。
为图表创建程序服务创建触发器
部署在 Cloud Run for Anthos 上的图表创建程序服务的 Eventarc 触发器过滤发布到某个 Pub/Sub 主题的消息。
创建触发器:
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
这将创建一个名为
trigger-chart-creator-gke
的触发器。设置 Pub/Sub 主题环境变量。
export TOPIC_QUERY_COMPLETED=$(basename $(gcloud eventarc triggers describe trigger-${SERVICE_NAME}-gke --format='value(transport.pubsub.topic)'))
部署查询运行程序服务
在 processing-pipelines
目录中,部署 Cloud Run for Anthos 服务,用于接收 Cloud Scheduler 事件,从公共 COVID-19 数据集中检索数据,并将结果保存在新的 BigQuery 表中。
构建并推送容器映像:
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
将容器映像部署到 Cloud Run for Anthos 并传入
PROJECT_ID
和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}
当您看到服务网址时,表示部署完成。
为查询运行程序服务创建触发器
部署在 Cloud Run for Anthos 上的查询运行程序服务的 Eventarc 触发器过滤发布到某个 Pub/Sub 主题的消息。
创建触发器:
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
这将创建一个名为
trigger-query-runner-gke
的触发器。为 Pub/Sub 主题设置环境变量。
export TOPIC_QUERY_SCHEDULED=$(gcloud eventarc triggers describe trigger-${SERVICE_NAME}-gke --format='value(transport.pubsub.topic)')
安排作业
处理流水线由两个 Cloud Scheduler 作业触发。
创建 Cloud Scheduler 需要的 App Engine 应用,并指定适当的位置(例如
europe-west
):export APP_ENGINE_LOCATION=LOCATION gcloud app create --region=${APP_ENGINE_LOCATION}
创建两个 Cloud Scheduler 作业,这些作业每天发布到 Pub/Sub 主题一次:
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"
时间表以 unix-cron 格式指定。例如,
0 16 * * *
表示作业在世界协调时间 (UTC) 每天 16:00(下午 4 点)运行。
运行流水线
确认所有触发器已成功创建:
gcloud eventarc triggers list
输出应类似如下所示:
NAME TYPE DESTINATION_RUN_SERVICE DESTINATION_RUN_PATH ACTIVE trigger-chart-creator-gke google.cloud.pubsub.topic.v1.messagePublished Yes trigger-notifier-gke google.cloud.audit.log.v1.written Yes trigger-query-runner-gke google.cloud.pubsub.topic.v1.messagePublished Yes
检索 Cloud Scheduler 作业 ID:
gcloud scheduler jobs list
输出应类似如下所示:
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
这些作业安排在每天下午 4 点和 5 点运行,但您也可以手动运行 Cloud Scheduler 作业:
gcloud scheduler jobs run cre-scheduler-cy gcloud scheduler jobs run cre-scheduler-uk
几分钟后,确认 Cloud Storage 存储桶中有两个图表:
gsutil ls gs://${BUCKET}
输出应类似如下所示:
gs://BUCKET/chart-cyprus.png gs://BUCKET/chart-unitedkingdom.png
恭喜!您应该还会收到两封电子邮件,其中包含图表链接。
清理
如果您为本教程创建了一个新项目,请删除项目。如果您使用的是现有项目,希望保留此项目且不保留本教程中添加的任何更改,请删除为教程创建的资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- 在 Google Cloud 控制台中,转到管理资源页面:
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。
删除教程资源
删除您在本教程中部署的所有 Cloud Run for Anthos 服务:
gcloud run services delete SERVICE_NAME
其中,SERVICE_NAME 是您选择的服务名称。
您还可以在 Google Cloud Console 中删除 Cloud Run for Anthos 服务。
删除您在本教程中创建的所有 Eventarc 触发器:
gcloud eventarc triggers delete TRIGGER_NAME
将 TRIGGER_NAME 替换为您的触发器的名称。
移除您在教程设置过程中添加的任何 gcloud 默认配置。
gcloud config unset project gcloud config unset run/cluster gcloud config unset run/cluster_location gcloud config unset run/platform gcloud config unset eventarc/location gcloud config unset compute/zone
- 从 Container Registry 中删除容器映像(该容器名为
gcr.io/PROJECT_ID/SERVICE_NAME
)。
- 从 Container Registry 中删除容器映像(该容器名为