通过创建总线和注册来发布和接收事件 (gcloud CLI)

本快速入门介绍了如何在 Google Cloud项目中创建 Eventarc Advanced 总线并进行注册,以发布和接收事件消息。

  • 总线充当中央路由器,接收来自事件源或提供方发布的消息。

  • 注册通过处理流水线将总线接收到的消息路由到一个或多个目的地。

在本快速入门中,您将执行以下操作:

  1. 创建 Artifact Registry 标准制品库。

  2. 将事件接收器服务部署到 Cloud Run。

  3. 创建 Eventarc Advanced 总线。

  4. 创建 Eventarc Advanced 注册。

  5. 向总线发布事件消息。

  6. 在 Cloud Run 日志中查看事件数据。

您可以使用 gcloud CLI 完成本快速入门。如需使用 Google Cloud 控制台完成这些步骤,请参阅通过创建总线和注册来发布和接收事件(控制台)

准备工作

您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud新手,请 创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 安装 Google Cloud CLI。

  3. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  4. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  5. 创建或选择 Google Cloud 项目

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
    • 创建项目:如需创建项目,您需要拥有 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予角色
    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目名称。

  6. 验证是否已为您的 Google Cloud 项目启用结算功能

  7. 启用 Artifact Registry API、Cloud Build API、Cloud Run API、Compute Engine API 和 Eventarc API:

    启用 API 所需的角色

    如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com compute.googleapis.com eventarc.googleapis.com eventarcpublishing.googleapis.com run.googleapis.com
  8. 安装 Google Cloud CLI。

  9. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  10. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  11. 创建或选择 Google Cloud 项目

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
    • 创建项目:如需创建项目,您需要拥有 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予角色
    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目名称。

  12. 验证是否已为您的 Google Cloud 项目启用结算功能

  13. 启用 Artifact Registry API、Cloud Build API、Cloud Run API、Compute Engine API 和 Eventarc API:

    启用 API 所需的角色

    如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com compute.googleapis.com eventarc.googleapis.com eventarcpublishing.googleapis.com run.googleapis.com
  14. 更新 gcloud 组件:
    gcloud components update
  15. 使用您的账号登录:
    gcloud auth login
  16. 设置本快速入门中使用的配置变量:
    REGION=REGION

    REGION 替换为总线的受支持位置

  17. 如果您是项目创建者,则会被授予基本 Owner 角色 (roles/owner)。默认情况下,此 Identity and Access Management (IAM) 角色可提供完全访问大多数 Google Cloud资源所需的权限,您可以跳过此步骤。

    如果您不是项目创建者,则必须向主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。

    请注意,默认情况下,Cloud Build 权限包含上传和下载 Artifact Registry 工件的权限

    所需权限

    如需获得完成本快速入门所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

    如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    您也可以通过自定义角色或其他预定义角色来获取所需的权限。

  18. 出于测试目的,请创建一个服务账号,并向其授予完成本快速入门所需的角色。
    1. 创建服务账号:
      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      SERVICE_ACCOUNT_NAME 替换为您的服务账号的名称。
    2. 授予构建和部署容器映像以及表示 Eventarc Advanced 流水线身份所需的角色:
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \
          --role=roles/artifactregistry.writer
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \
          --role=roles/logging.logWriter
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \
          --role=roles/storage.admin
      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 的访问权限控制

创建 Artifact Registry 标准制品库

创建 Artifact Registry 标准制品库以存储您的容器映像。

gcloud artifacts repositories create REPOSITORY \
    --repository-format=docker \
    --location=$REGION

REPOSITORY 替换为 Artifact Registry 制品库的唯一名称,例如 my-repo

将事件接收器服务部署到 Cloud Run

部署记录事件内容的 Cloud Run 服务。系统还支持其他事件目标,例如 Pub/Sub 主题、Workflows 或 HTTP 端点。如需了解详情,请参阅事件提供方和目的地

  1. 克隆 GitHub 代码库:

    git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git
  2. 切换到包含 Cloud Run 示例代码的目录:

    cd eventarc-samples/eventarc-advanced-quickstart/
  3. 构建 Docker 容器映像并将该映像推送到您的代码库:

    gcloud builds submit \
        --tag $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/log-events:v1 \
        --service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --default-buckets-behavior=regional-user-owned-bucket
  4. 将容器映像部署到 Cloud Run:

    gcloud run deploy SERVICE_NAME \
        --image $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/log-events:v1 \
        --platform managed \
        --ingress all \
        --no-allow-unauthenticated \
        --region=$REGION

    SERVICE_NAME 替换为您的服务名称,例如 my-service

    all 的入站流量设置允许所有请求,包括直接从互联网发送到 run.app 网址的请求。如需了解详情,请参阅限制 Cloud Run 的网络入站流量

    --no-allow-unauthenticated 标志将服务配置为仅允许经过身份验证的调用。

当您看到 Cloud Run 服务网址时,表示部署完成。记下此网址,以便在后续步骤中使用。

创建 Eventarc Advanced 总线

总线接收来自消息源或由提供方发布的事件消息,并充当消息路由器。

如需了解详情,请参阅创建用于路由消息的总线

使用 gcloud eventarc message-buses create 命令在项目中创建 Eventarc Advanced 总线:

gcloud eventarc message-buses create BUS_NAME \
    --location=$REGION

BUS_NAME 替换为总线的 ID 或完全限定的标识符,例如 my-bus

创建 Eventarc Advanced 注册

注册可确定哪些消息会路由到目的地,还会指定用于为事件消息配置目的地的流水线。

如需了解详情,请参阅创建注册以接收事件

使用 gcloud CLI 时,您首先要创建流水线,然后再创建注册:

  1. 使用 gcloud eventarc pipelines create 命令创建流水线:

    gcloud eventarc pipelines create PIPELINE_NAME \
        --destinations=http_endpoint_uri='CLOUD_RUN_SERVICE_URL',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 令牌

  2. 使用 gcloud eventarc enrollments create 命令创建注册:

    gcloud 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 eventarc message-buses publish 命令或向 Eventarc Publishing REST API 发送请求。如需了解详情,请参阅直接发布事件

消息必须采用 CloudEvents 格式,这是一种以通用方式描述事件数据的规范。data 元素是事件的载荷。此字段中可以包含任何格式正确的 JSON。如需详细了解 CloudEvents 上下文属性,请参阅事件格式

以下示例展示了如何直接将事件发布到 Eventarc Advanced 总线:

示例 1

您可以使用 gcloud CLI 和 --event-data 及其他事件属性标志将事件发布到总线:

gcloud 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 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 服务的日志,验证事件是否按预期接收。

  1. 使用 gcloud logging read 命令过滤日志条目并返回输出:

    gcloud logging read 'textPayload: "hello-world-data"'
    
  2. 查找如下日志条目:

    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 总线和注册,向该总线发布事件消息,并在事件接收器服务的日志中验证预期结果。

清理

完成此快速入门中描述的任务后,您可以通过删除所创建的资源来避免继续计费:

  1. 删除 Artifact Registry 制品库

  2. 删除 Cloud Run 服务

  3. 删除 Eventarc Advanced 资源:

    1. 删除注册数据

    2. 删除流水线

    3. 删除总线

或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统即会停止对该项目中使用的所有资源计费。

删除 Google Cloud 项目:

gcloud projects delete PROJECT_ID

后续步骤