使用 Eventarc 事件触发 Cloud Run

1. 简介

894762ebb681671c.png

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

cb762f29e9183a3f.png

借助 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 事件目的地。

59b147dc030b2b0b.png

Google Cloud 来源

属于 Google Cloud 的产品

Google 来源

Google 拥有的产品(例如 Gmail、环聊、Android 管理服务等)中的事件源

自定义来源

非 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

创建

创建触发器,以过滤发布到 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 实例的“日志”部分中看到下列内容:

69e0177e04a0d1af.png

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

904cfc93bb8e8df1.png

8. 创建 Cloud Audit Logs 触发器

虽然 Cloud Storage 触发器是侦听 Cloud Storage 事件的更好方式,但在此步骤中,您将创建一个 Cloud Audit Logs 触发器来执行相同的操作。

设置

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

3c654597faed237c.png

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

1deb3ad78f11dd5f.png

创建

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

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.png

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

b4d8bbc6601a8b9e.png

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

3ee290ec72f130d5.png

10. 恭喜!

恭喜您完成此 Codelab。

所学内容

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