使用 Eventarc 事件触发 Cloud Run

1. 简介

894762ebb681671c.png

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

cb762f29e9183a3f.png

借助 Eventarc,您可以轻松地将各种服务(Cloud Run、Cloud Functions、Workfklows)与各种来源的事件连接起来。您可以用它来构建事件驱动型架构,其中微服务是松散耦合和分布式的。它还负责事件提取、传送、安全性、授权和错误处理,从而提高开发者的敏捷性和应用弹性。

在此 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 事件目的地。

59b147dc030b2b0b

Google Cloud 来源

属于 Google Cloud 自有产品的事件来源

Google 来源

属于 Google 自有产品(例如 Gmail、Hangouts、Android Management 等)的事件来源

自定义来源

由最终用户自行创建的活动来源(非 Google 自有产品)

第三方来源

既非 Google 自有也不由客户生成的事件来源。这包括由第三方提供商和合作伙伴拥有和维护的热门事件来源,例如 Check Point CloudGuard、Datadog、ForgeRock、Lacework 等。

事件被标准化为 CloudEvents v1.0 格式,以实现跨服务互操作性。CloudEvents 是一种独立于供应商的开放式规范,以通用格式描述事件数据,以实现跨服务、平台和系统的互操作性。

3. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 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

创建

创建一个触发器,以过滤发布到我们部署的 Cloud Run 服务的 Pub/Sub 主题的事件:

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 实例的“日志”部分查看此信息:

69e0177e04a0d1af

使用现有 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

您还需要将 pubsub.publisher 角色添加到 Cloud Storage 触发器的 Cloud Storage 服务账号:

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 服务的日志,应该会看到收到的事件:

904cfc93bb8e8df1

8. 创建 Cloud Audit Logs 触发器

虽然 Cloud Storage 触发器是监听 Cloud Storage 事件的更好方法,但在此步骤中,您将创建一个 Cloud Audit Log 触发器来实现此目的。

设置

如需接收来自服务的事件,您需要启用 Cloud Audit Logs。在 Cloud 控制台中,从左上角菜单中选择 IAM & AdminAudit Logs。在服务列表中,选中 Google Cloud Storage

3c654597faed237c.png

在右侧,确保选中 AdminReadWrite,然后点击 Save

1deb3ad78f11dd5f

创建

创建一个触发器,以将新的文件创建事件从存储分区路由到您的服务:

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 服务的日志,应该会看到收到的事件:

7be7859bcc8976f8.png

9. 探索 Eventarc 界面

在此步骤中,您将探索 Google Cloud 控制台中的 Eventarc 界面。在 Eventarc 界面中,您可以通过 Google Cloud 控制台大致了解所有触发器、修改和删除这些触发器,以及创建新触发器。

转到 Google Cloud 的 Eventarc 部分:

81e139f17e0d29bf.png

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

3240c7c830398718

如果点击触发器,可以查看触发器的详细信息,还可以修改或删除触发器:

b4d8bbc6601a8b9e.png

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

3ee290ec72f130d5

10. 恭喜!

恭喜您完成此 Codelab。

所学内容

  • Eventarc 的愿景
  • 探索 Eventarc 中的活动
  • 创建 Cloud Run 接收器
  • 为 Pub/Sub 创建触发器
  • 为 Cloud Storage 创建触发器
  • 为 Cloud Audit Logs 创建触发器
  • 探索 Eventarc 界面