1. 简介

借助 Cloud Run,您可以在全托管式环境中运行无状态容器。它基于开源 Knative 构建而成,可让您选择使用 Cloud Run 在全托管式环境中运行容器,或使用 Cloud Run for Anthos 在您的 Google Kubernetes Engine 集群中运行容器。

借助 Eventarc,您可以轻松地将各种服务(Cloud Run、Cloud Functions、Workflows)与来自各种来源的事件相关联。它可让您构建微服务松散耦合且分布式的事件驱动型架构。它还会为您处理事件提取、传送、安全、授权和错误处理,从而提高开发者的敏捷性和应用弹性。
在此 Codelab 中,您将了解 Eventarc。更具体地说,您将使用 Eventarc 监听来自 Pub/Sub、Cloud Storage 和 Cloud Audit Logs 的事件,并将这些事件传递给 Cloud Run 服务。
学习内容
- Eventarc 的愿景
- 在 Eventarc 中发现事件
- 创建 Cloud Run 接收器
- 为 Pub/Sub 创建触发器
- 为 Cloud Storage 创建触发器
- 为 Cloud Audit Logs 创建触发器
- 探索 Eventarc 界面
2. Eventarc 的愿景
Eventarc 旨在将来自各种 Google、Google Cloud 和第三方事件源的事件传递到 Google Cloud 事件目的地。

Google Cloud 来源 | 属于 Google Cloud 的产品 |
Google 来源 | Google 拥有的产品(例如 Gmail、环聊、Android 管理服务等)中的事件源 |
自定义来源 | 非 Google 拥有的产品,由最终用户自行创建的事件源 |
第三方来源 | 既非 Google 所有也非客户制作的活动来源。这包括由第三方提供方和合作伙伴拥有和维护的热门事件源,例如 Check Point CloudGuard、Datadog、ForgeRock、Lacework 等。 |
为了实现跨服务互操作性,事件会标准化为 CloudEvents v1.0 格式。CloudEvents 是一种与供应商无关的开放规范,用于以通用格式描述事件数据,从而实现跨服务、平台和系统的互操作性。
3. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。



- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为
PROJECT_ID),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。 - 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
启动 Cloud Shell
虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。
在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。只需一个浏览器,即可完成本实验中的所有工作。
准备工作
在 Cloud Shell 中,确保项目 ID 已设置:
PROJECT_ID=your-project-id gcloud config set project $PROJECT_ID
4. 部署 Cloud Run 服务
部署 Cloud Run 服务以接收事件。您将部署 Cloud Run 的 Hello 容器,该容器会记录 CloudEvents 的内容。
首先,为 Cloud Run 启用所需的服务:
gcloud services enable run.googleapis.com
将 hello 容器部署到 Cloud Run:
REGION=us-central1 SERVICE_NAME=hello gcloud run deploy $SERVICE_NAME \ --allow-unauthenticated \ --image=gcr.io/cloudrun/hello \ --region=$REGION
成功完成时,命令行会显示服务网址。您可以在任何浏览器窗口中打开该服务网址,以仔细检查该服务是否已部署。
5. 活动发现
在 Eventarc 中创建触发器之前,您可以了解事件来源、它们可以发出的事件类型,以及如何配置触发器以使用这些事件。
如需查看不同类型事件的列表,请执行以下操作:
gcloud beta eventarc attributes types list NAME DESCRIPTION google.cloud.audit.log.v1.written Cloud Audit Log written google.cloud.pubsub.topic.v1.messagePublished Cloud Pub/Sub message published google.cloud.storage.object.v1.archived Cloud Storage: Sent when a live version of an (object versioned) object is archived or deleted. google.cloud.storage.object.v1.deleted Cloud Storage: Sent when an object has been permanently deleted. google.cloud.storage.object.v1.finalized Cloud Storage: Sent when a new object (or a new generation of an existing object). google.cloud.storage.object.v1.metadataUpdated Cloud Storage: Sent when the metadata of an existing object changes.
如需详细了解每种事件类型,请执行以下操作:
gcloud beta eventarc attributes types describe google.cloud.audit.log.v1.written attributes: type,serviceName,methodName,resourceName description: 'Cloud Audit Log: Sent when a log is written.' name: google.cloud.audit.log.v1.written
如需查看会发出特定事件类型的服务列表,请执行以下操作:
gcloud beta eventarc attributes service-names list --type=google.cloud.audit.log.v1.written SERVICE_NAME DISPLAY_NAME accessapproval.googleapis.com Access Approval accesscontextmanager.googleapis.com Access Context Manager admin.googleapis.com Google Workspace Admin aiplatform.googleapis.com AI Platform (under Vertex AI) apigee.googleapis.com Apigee apigeeconnect.googleapis.com Apigee Connect ... workflows.googleapis.com Workflows
如需查看每项服务可发出的方法名称(子事件)列表,请执行以下操作:
gcloud beta eventarc attributes method-names list --type=google.cloud.audit.log.v1.written --service-name=workflows.googleapis.com METHOD_NAME google.cloud.workflows.v1.Workflows.CreateWorkflow google.cloud.workflows.v1.Workflows.DeleteWorkflow google.cloud.workflows.v1.Workflows.GetWorkflow google.cloud.workflows.v1.Workflows.ListWorkflows google.cloud.workflows.v1.Workflows.UpdateWorkflow google.cloud.workflows.v1beta.Workflows.CreateWorkflow google.cloud.workflows.v1beta.Workflows.DeleteWorkflow google.cloud.workflows.v1beta.Workflows.GetWorkflow google.cloud.workflows.v1beta.Workflows.ListWorkflows google.cloud.workflows.v1beta.Workflows.UpdateWorkflow
6. 创建 Pub/Sub 触发器
Cloud Pub/Sub 是接收事件的一种途径。任何应用都可以将消息发布到 Pub/Sub,然后这些消息可经由 Eventarc 传递到 Cloud Run。
设置
在创建任何触发器之前,请为 Eventarc 启用所需的服务:
gcloud services enable eventarc.googleapis.com
您还需要一个供触发器使用的服务账号。创建服务账号:
SERVICE_ACCOUNT=eventarc-trigger-sa gcloud iam service-accounts create $SERVICE_ACCOUNT
创建
创建触发器,以过滤发布到 Pub/Sub 主题的事件,仅将符合条件的事件传递到我们部署的 Cloud Run 服务:
TRIGGER_NAME=trigger-pubsub gcloud eventarc triggers create $TRIGGER_NAME \ --destination-run-service=$SERVICE_NAME \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --location=$REGION \ --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
测试
Pub/Sub 触发器会在底层创建一个主题。我们来找出该值并将其分配给一个变量:
TOPIC_ID=$(gcloud eventarc triggers describe $TRIGGER_NAME --location $REGION --format='value(transport.pubsub.topic)')
使用 gcloud 向主题发布消息:
gcloud pubsub topics publish $TOPIC_ID --message="Hello World"
Cloud Run 服务会记录收到的消息正文。您可以在 Cloud Run 实例的“日志”部分中看到下列内容:

使用现有 Pub/Sub 主题创建
默认情况下,当您创建 Pub/Sub 触发器时,Eventarc 会在后台为您创建一个主题,以用作应用与 Cloud Run 服务之间的传输主题。这有助于轻松快速地创建 Pub/Sub 支持的触发器,但有时您可能想使用现有主题。借助 Eventarc,您可以使用 --transport-topic gcloud 标志指定同一项目中的现有 Pub/Sub 主题。
如需了解此功能的工作原理,请创建一个 Pub/Sub 主题以用作传输主题:
TOPIC_ID=eventarc-topic gcloud pubsub topics create $TOPIC_ID
创建触发器:
TRIGGER_NAME=trigger-pubsub-existing gcloud eventarc triggers create $TRIGGER_NAME \ --destination-run-service=$SERVICE_NAME \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --location=$REGION \ --transport-topic=projects/$PROJECT_ID/topics/$TOPIC_ID \ --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
您可以通过向主题发送消息来测试触发器:
gcloud pubsub topics publish $TOPIC_ID --message="Hello again"
7. 创建 Cloud Storage 触发器
在此步骤中,您将创建一个触发器来侦听来自 Cloud Storage 的事件。
设置
首先,创建一个用于接收事件的存储分区:
BUCKET_NAME=eventarc-gcs-$PROJECT_ID gsutil mb -l $REGION gs://$BUCKET_NAME
授予 eventarc.eventReceiver 角色,以便在 Cloud Storage 触发器中使用该服务账号:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/eventarc.eventReceiver \ --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
您还需要为 Cloud Storage 触发器向 Cloud Storage 服务账号添加 pubsub.publisher 角色:
SERVICE_ACCOUNT_STORAGE=$(gsutil kms serviceaccount -p $PROJECT_ID)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:$SERVICE_ACCOUNT_STORAGE \
--role roles/pubsub.publisher
创建
创建触发器,以将存储分区中的新文件创建事件路由到您的服务:
TRIGGER_NAME=trigger-storage gcloud eventarc triggers create $TRIGGER_NAME \ --destination-run-service=$SERVICE_NAME \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET_NAME" \ --location=$REGION \ --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
测试
列出所有触发器,以确认触发器已成功创建:
gcloud eventarc triggers list
将文件上传到 Cloud Storage 存储分区:
echo "Hello World" > random.txt gsutil cp random.txt gs://$BUCKET_NAME/random.txt
如果您在 Cloud 控制台中查看 Cloud Run 服务的日志,应该会看到收到的事件:

8. 创建 Cloud Audit Logs 触发器
虽然 Cloud Storage 触发器是侦听 Cloud Storage 事件的更好方式,但在此步骤中,您将创建一个 Cloud Audit Logs 触发器来执行相同的操作。
设置
要想接收来自某一服务的事件,您需要启用 Cloud Audit Logs。在 Cloud 控制台中,从左上角的菜单中选择 IAM & Admin 和 Audit Logs。在服务列表中,选中 Google Cloud Storage:

在右侧,确保已选择 Admin、Read 和 Write,然后点击 Save:

创建
创建触发器,以将存储分区中的新文件创建事件路由到您的服务:
TRIGGER_NAME=trigger-auditlog-storage gcloud eventarc triggers create $TRIGGER_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" \ --event-filters-path-pattern="resourceName=/projects/_/buckets/$BUCKET_NAME/objects/*" \ --location=$REGION \ --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
测试
审核日志触发器需要一些时间才能完成初始化。您可以通过列出所有触发器来检查触发器是否已创建:
gcloud eventarc triggers list
您应该会看到 ACTIVE 字段为 Yes:
NAME TYPE DESTINATION ACTIVE trigger-auditlog-storage google.cloud.audit.log.v1.written Cloud Run service: hello Yes
像之前那样将同一文件上传到 Cloud Storage 存储桶:
gsutil cp random.txt gs://$BUCKET_NAME/random.txt
如果您在 Cloud 控制台中查看 Cloud Run 服务的日志,应该会看到收到的事件:

9. 探索 Eventarc 界面
在此步骤中,您将探索 Google Cloud 控制台中的 Eventarc 界面。在 Eventarc 界面中,您可以概览所有触发器、修改和删除触发器,以及通过 Google Cloud 控制台创建新触发器。
前往 Google Cloud 的 Eventarc 部分:

您会看到之前创建的触发器列表:

点击触发器后,您可以查看、修改或删除触发器的详细信息:

您还可以选择 Create trigger 来创建新触发器,然后填写触发器的详细信息:

10. 恭喜!
恭喜您完成此 Codelab。
所学内容
- Eventarc 的愿景
- 在 Eventarc 中发现事件
- 创建 Cloud Run 接收器
- 为 Pub/Sub 创建触发器
- 为 Cloud Storage 创建触发器
- 为 Cloud Audit Logs 创建触发器
- 探索 Eventarc 界面