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

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

借助总线,您可以集中管理系统中的消息流,并充当路由器。它会接收来自消息来源或由提供方发布的事件,并根据注册进行评估。

注册会标识对特定总线的订阅,并定义消息的匹配条件,以便将消息相应地路由到一个或多个目的地。

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

  1. 创建子网并启用专用 Google 访问通道。

  2. 创建网络连接。

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

  4. 创建 Eventarc Advanced 总线。

  5. 创建 Eventarc Advanced 注册。

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

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

您可以使用 Google Cloud CLI 来完成本快速入门。

准备工作

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

  1. 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.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. 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.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 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
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. 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.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. 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
  12. 更新 gcloud 组件:
    gcloud components update
  13. 使用您的账号登录:
    gcloud auth login
  14. 设置本快速入门中使用的配置变量:
    REGION=REGION

    REGION 替换为相应公交车的受支持的位置

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

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

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

    所需权限

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

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

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

  16. Compute Engine 默认服务账号授予项目的以下角色。构建和部署容器映像时需要以下角色:
    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)'
  17. 默认情况下,只有 Project Owner、Project Editor 以及 Cloud Run Admin 和 Invoker 才能调用 Cloud Run 服务。如需设置身份验证,请向服务账号授予 Google Cloud 项目的 Cloud Run Invoker 角色 (run.invoker):
    1. 创建一个服务账号。为了进行测试,您将将此服务账号附加到 Eventarc Advanced 流水线以表示该流水线的身份。
      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      SERVICE_ACCOUNT_NAME 替换为您的服务账号的名称。
    2. 向服务账号授予 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 的访问权限控制

创建子网并启用专用 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 网络访问,并且无法直接访问服务网址,因为该服务仅允许经过身份验证的调用。

  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
  4. 将容器映像部署到 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 时,您需要先创建流水线,然后再创建注册。

  1. 使用 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 令牌的服务账号电子邮件地址。

  2. 使用 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 服务的日志,以验证事件是否已按预期收到。

  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. 删除 VPC 子网

  2. 删除 VPC 网络附加项

  3. 删除 Artifact Registry 制品库

  4. 删除 Cloud Run 服务

  5. 删除 Eventarc Advanced 资源:

    1. 删除注册

    2. 删除流水线

    3. 删除公交车

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

Delete a Google Cloud project:

gcloud projects delete PROJECT_ID

后续步骤