通过创建总线和注册来发布和接收事件
本快速入门介绍了如何通过在 Google Cloud 项目中创建 Eventarc Advanced 总线并进行注册,发布和接收事件消息。
借助总线,您可以集中管理系统中的消息流,并充当路由器。它会接收来自消息来源或由提供方发布的事件,并根据注册进行评估。
注册会标识对特定总线的订阅,并定义消息的匹配条件,以便将消息相应地路由到一个或多个目的地。
在本快速入门中,您将执行以下操作:
创建子网并启用专用 Google 访问通道。
创建网络连接。
将事件接收器服务部署到 Cloud Run。
创建 Eventarc Advanced 总线。
创建 Eventarc Advanced 注册。
向总线发布事件消息。
在 Cloud Run 日志中查看事件数据。
您可以使用 Google Cloud CLI 来完成本快速入门。
准备工作
您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Compute Engine, and Eventarc APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com compute.googleapis.com eventarc.googleapis.com eventarcpublishing.googleapis.com run.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Compute Engine, and Eventarc APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com compute.googleapis.com eventarc.googleapis.com eventarcpublishing.googleapis.com run.googleapis.com - 更新
gcloud
组件:gcloud components update
- 使用您的账号登录:
gcloud auth login
- 设置本快速入门中使用的配置变量:
REGION=REGION
将
REGION
替换为相应公交车的受支持的位置。 -
如果您是项目创建者,则会被授予基本 Owner 角色 (
roles/owner
)。默认情况下,此 Identity and Access Management (IAM) 角色可提供完全访问大多数 Google Cloud 资源所需的权限,您可以跳过此步骤。如果您不是项目创建者,则必须向主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。
请注意,默认情况下,Cloud Build 权限包含上传和下载 Artifact Registry 工件的权限。
所需权限
如需获得完成本快速入门所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
-
Cloud Build Editor (
roles/cloudbuild.builds.editor
) -
Cloud Run Admin (
roles/run.admin
) -
Eventarc Developer (
roles/eventarc.developer
) -
Eventarc Message Bus Admin (
roles/eventarc.messageBusAdmin
) -
Logs View Accessor (
roles/logging.viewAccessor
) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin
) -
Service Account Admin (
roles/iam.serviceAccountAdmin
) -
Service Account User (
roles/iam.serviceAccountUser
) -
Service Usage Admin (
roles/serviceusage.serviceUsageAdmin
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
-
Cloud Build Editor (
- 向 Compute Engine 默认服务账号授予项目的以下角色。构建和部署容器映像时需要以下角色:
- Artifact Registry Writer:用于上传 Artifact Registry 工件
- 日志写入器:用于将日志写入 Cloud Logging
- 存储对象用户:用于访问 Cloud Storage 对象
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/artifactregistry.writer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/logging.logWriter gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/storage.objectUser
将
PROJECT_NUMBER
替换为您的 Google Cloud 项目编号。您可以在 Google Cloud 控制台的欢迎页面上或者通过运行以下命令找到项目编号:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
- 默认情况下,只有 Project Owner、Project Editor 以及 Cloud Run Admin 和 Invoker 才能调用 Cloud Run 服务。如需设置身份验证,请向服务账号授予 Google Cloud 项目的 Cloud Run Invoker 角色 (
run.invoker
):- 创建一个服务账号。为了进行测试,您将将此服务账号附加到 Eventarc Advanced 流水线以表示该流水线的身份。
将gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAME
替换为您的服务账号的名称。 - 向服务账号授予
roles/run.invoker
IAM 角色:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --role=roles/run.invoker
请注意,您可以通过以下任一方式配置谁可以访问您的 Cloud Run 服务:
- 向选定的服务账号或群组授予此权限,以允许访问服务。所有请求都必须具有 HTTP 授权标头,其中包含由 Google 为其中一个已获授权的服务账号签名的 OpenID Connect 令牌。本快速入门将以这种方式配置访问权限。
- 向
allUsers
授予权限,以允许未经身份验证的访问。
如需了解详情,请参阅 Cloud Run 的访问权限控制。
- 创建一个服务账号。为了进行测试,您将将此服务账号附加到 Eventarc Advanced 流水线以表示该流水线的身份。
创建子网并启用专用 Google 访问通道
除非您创建组织政策来禁止 VPC 网络,否则新的 Google Cloud 项目会首先创建一个默认的虚拟私有云 (VPC) 网络(自动模式 VPC 网络),此网络在每个区域内都包含一个子网。子网具有与之关联的 IP 地址范围。
由于您要使用 DNS 地址将消息路由到 Cloud Run 目的地,因此必须在网络连接中使用的子网上启用专用 Google 访问通道;否则,DNS 地址将无法解析。如需详细了解专用网络和 Cloud Run,请参阅接收来自 VPC 网络的请求。
在项目的默认网络中创建一个子网,然后使用 --enable-private-ip-google-access
标志启用专用 Google 访问通道:
gcloud compute networks subnets create SUBNET_NAME \
--network=default \
--range=10.8.0.0/24 \
--region=$REGION \
--enable-private-ip-google-access
将 SUBNET_NAME
替换为您的子网名称,例如 my-subnet
。
子网 IP 范围在一个 VPC 网络和对等 VPC 网络中必须唯一且不得互相重叠。如需详细了解子网类型和有效的子网范围,请参阅子网。
创建网络连接
网络连接是一种资源,允许提供方 VPC 网络发起与使用方 VPC 网络的连接。为了发布事件,Eventarc Advanced 使用网络连接与 VPC 网络中托管的端点建立连接。
在包含事件目的地端点的同一网络和区域中创建网络连接,并自动接受与该网络连接关联的任何 Private Service Connect 接口发出的连接:
gcloud compute network-attachments create ATTACHMENT_NAME \
--region=$REGION \
--connection-preference=ACCEPT_AUTOMATIC \
--subnets=SUBNET_NAME
将 ATTACHMENT_NAME
替换为网络附加项的名称,例如 my-network-attachment
。
创建 Artifact Registry 标准制品库
创建 Artifact Registry 标准制品库以存储您的容器映像。
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
将 REPOSITORY
替换为 Artifact Registry 制品库的唯一名称,例如 my-repo
。
将事件接收器服务部署到 Cloud Run
部署记录事件内容的 Cloud Run 服务。此服务只能通过同一项目中的 VPC 网络访问,并且无法直接访问服务网址,因为该服务仅允许经过身份验证的调用。
克隆 GitHub 代码库:
git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git
切换到包含 Cloud Run 示例代码的目录:
cd eventarc-samples/eventarc-advanced-quickstart/
构建 Docker 容器映像,并将映像推送到代码库:
gcloud builds submit \ --tag $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/log-events:v1
将容器映像部署到 Cloud Run:
gcloud run deploy SERVICE_NAME \ --image $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/log-events:v1 \ --platform managed \ --ingress internal \ --no-allow-unauthenticated \ --region=$REGION
将
SERVICE_NAME
替换为您的服务名称,例如my-service
。
当您看到 Cloud Run 服务网址时,表示部署完成。记下此网址,以便在后续步骤中使用。
创建 Eventarc Advanced 总线
使用 gcloud beta eventarc message-buses create
命令在项目中创建 Eventarc Advanced 总线:
gcloud beta eventarc message-buses create BUS_NAME \ --location=$REGION
将 BUS_NAME
替换为您的公交车的 ID 或完全限定标识符,例如 my-bus
。
如需了解详情,请参阅创建用于路由消息的总线。
创建 Eventarc Advanced 注册
注册决定了哪些消息会被路由到目标位置。它还指定了消息应通过的流水线。该流水线用于为事件消息配置目标位置。
如需了解详情,请参阅创建注册以接收事件。
使用 gcloud CLI 时,您需要先创建流水线,然后再创建注册。
使用
gcloud beta eventarc pipelines create
命令创建流水线:gcloud beta eventarc pipelines create PIPELINE_NAME \ --destinations=http_endpoint_uri='CLOUD_RUN_SERVICE_URL',network_attachment=ATTACHMENT_NAME,google_oidc_authentication_service_account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --location=$REGION
替换以下内容:
PIPELINE_NAME
:流水线的 ID 或完全限定名称。CLOUD_RUN_SERVICE_URL
:Cloud Run 服务的完全限定网址,例如https://SERVICE_NAME-abcdef-uc.a.run.app
。这是事件消息的目标位置。
请注意,
google_oidc_authentication_service_account
键指定了用于生成 OIDC 令牌的服务账号电子邮件地址。使用
gcloud beta eventarc enrollments create
命令创建注册:gcloud beta eventarc enrollments create ENROLLMENT_NAME \ --cel-match=MATCH_EXPRESSION \ --destination-pipeline=PIPELINE_NAME \ --message-bus=BUS_NAME \ --message-bus-project=PROJECT_ID \ --location=$REGION
替换以下内容:
ENROLLMENT_NAME
:注册的 ID 或完全限定名称。MATCH_EXPRESSION
:使用 CEL 为此注册表单创建的匹配表达式,例如"message.type == 'hello-world-type'"
。
向总线发布事件消息
如需直接将消息发布到您的总线,您可以使用 gcloud beta eventarc message-buses publish
命令或向 Eventarc Publishing REST API 发送请求。如需了解详情,请参阅直接发布事件。
消息必须采用 CloudEvents 格式,这是一种以通用方式描述事件数据的规范。data
元素是事件的载荷。任何格式正确的 JSON 都可以填入此字段。如需详细了解 CloudEvents 上下文属性,请参阅事件格式。
以下是直接将事件发布到 Eventarc Advanced 总线的示例:
示例 1
您可以使用 gcloud CLI 以及 --event-data
和其他事件属性标志将事件发布到总线:
gcloud beta eventarc message-buses publish BUS_NAME \
--event-data='{"key": "hello-world-data"}' \
--event-id=hello-world-id-1234 \
--event-source=hello-world-source \
--event-type=hello-world-type \
--event-attributes="datacontenttype=application/json" \
--location=$REGION
示例 2
您可以使用 gcloud CLI 和 --json-message
标志将事件作为 JSON 消息发布到总线:
gcloud beta eventarc message-buses publish BUS_NAME \
--location=$REGION \
--json-message='{"id": "hello-world-id-1234", "type":
"hello-world-type", "source":
"hello-world-source", "specversion": "1.0", "data":
{"key": "hello-world-data"}}'
发布事件后,您应该会收到“事件已成功发布”消息。
在 Cloud Run 日志中查看事件数据
将事件发布到 Eventarc Advanced 总线后,您可以查看 Cloud Run 服务的日志,以验证事件是否已按预期收到。
使用
gcloud logging read
命令过滤日志条目并返回输出:gcloud logging read 'textPayload: "hello-world-data"'
查找如下日志条目:
insertId: 670808e70002b5c6477709ae labels: instanceId: 007989f2a10a4a33c21024f2c8e06a9de65d9b4fdc2ee27697a50379b3fab2f975b9233dc357d50b06270829b9b479d5a1ee54a10fa2cb2d98c5f77a0895e2be0f9e6e4b20 logName: projects/PROJECT_ID/logs/run.googleapis.com%2Fstderr receiveTimestamp: '2024-10-10T17:03:35.424659450Z' resource: labels: ... type: cloud_run_revision textPayload: "[2024-10-21 15:33:19,581] INFO in server: Body: b'{\"value\":\"hello-world-data\"\ }'" timestamp: '2024-10-10T17:03:35.177606Z'
您已成功创建 Eventarc Advanced 总线和注册,向总线发布了事件消息,并在事件接收器服务的日志中验证了预期结果。
清理
完成本快速入门中所述的任务后,您可以通过删除所创建的资源来避免继续计费:
删除 Eventarc Advanced 资源:
或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID