发布来自 Google 来源的事件

您可以启用从 Google 来源收集和发布事件的功能。如需了解详情,请参阅发布来自 Google 来源的事件

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

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

  • 注册会标识对特定总线的订阅,并定义消息的匹配条件,从而使消息能够相应地路由到一个或多个目的地。

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

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

  2. 创建 Eventarc Advanced 总线。

  3. 启用来自 Google 来源的事件。

  4. 创建 Eventarc Advanced 注册。

  5. 通过创建工作流,将事件消息发布到总线。

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

您可以使用 gcloud 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. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

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

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

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Artifact Registry, Cloud Build, Cloud Run, Eventarc, and Workflows APIs:

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com eventarc.googleapis.com eventarcpublishing.googleapis.com run.googleapis.com workflows.googleapis.com
  8. Install the Google Cloud CLI.

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

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

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

  12. Verify that billing is enabled for your Google Cloud project.

  13. Enable the Artifact Registry, Cloud Build, Cloud Run, Eventarc, and Workflows APIs:

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

    REGION 替换为总线的受支持位置,例如 us-central1

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

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

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

    所需权限

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

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

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

  18. 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)'
  19. 默认情况下,只有 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 的访问权限控制

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

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

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

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

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

    2. 克隆 GitHub 代码库:

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

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

      gcloud builds submit \
          --tag $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/log-events:v1
    5. 将容器映像部署到 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

      请注意以下几点:

      • --platform 标志用于设置目标平台,在本例中为 Cloud Run 的全托管式版本。

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

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

      • 当您看到 Cloud Run 服务网址时,表示部署完成。

    6. 复制并保存 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

    启用来自 Google 来源的事件

    如需发布来自 Google 来源的事件,您必须创建 GoogleApiSource 资源。此资源表示对特定 Google Cloud 项目和区域中特定 Eventarc Advanced 总线的 Google API 事件的订阅。

    使用 gcloud eventarc google-api-sources create 命令启用来自 Google 来源的事件:

    gcloud eventarc google-api-sources create GOOGLE_API_SOURCE_NAME \
        --destination-message-bus=BUS_NAME \
        --destination-message-bus-project=PROJECT_ID \
        --location=$REGION

    GOOGLE_API_SOURCE_NAME 替换为 GoogleApiSource 资源的 ID 或完全限定名称,例如 my-google-api-source

    现在,系统会收集支持的所有 Google 事件类型(直接从 Google 来源发送),并将其发布到您的总线。

    创建 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 或完全限定名称,例如 my-pipeline
      • 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 或完全限定名称,例如 my-enrollment
      • MATCH_EXPRESSION:此注册的匹配表达式(使用 CEL)- 例如,如需在每次创建 Workflows 工作流时发布事件消息,请使用以下表达式:

        "message.type == 'google.cloud.workflows.workflow.v1.created'"
        

    通过创建工作流将事件消息发布到总线

    Workflows 是一个全代管式编排平台,该平台会按照您定义的顺序执行服务:工作流。创建工作流,以从 Google 来源生成支持的事件类型

    1. 在您的主目录中,创建一个名为 myWorkflow.yaml 的新文件。

    2. 将以下工作流复制并粘贴到新文件中,然后保存:

      - getCurrentTime:
          call: http.get
          args:
            url: https://timeapi.io/api/Time/current/zone?timeZone=Europe/Amsterdam
          result: currentTime
      - readWikipedia:
          call: http.get
          args:
            url: https://en.wikipedia.org/w/api.php
            query:
              action: opensearch
              search: ${currentTime.body.dayOfWeek}
          result: wikiResult
      - returnResult:
          return: ${wikiResult.body[1]}
      

      此工作流会将一周中的当前日期作为搜索字词传递给 Wikipedia API。系统会返回相关 Wikipedia 文章的列表。

    3. 使用 gcloud workflows deploy 命令部署工作流并将其与指定的服务账号相关联:

      gcloud workflows deploy myWorkflow --source=myWorkflow.yaml \
          --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --location=$REGION

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

    将事件发布到 Eventarc Advanced 总线后,您可以检查 Cloud Run 服务的日志,验证事件是否按预期接收。

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

      gcloud logging read 'textPayload: "google.cloud.workflows.workflow.v1.created"'
      
    2. 查找如下日志条目:

      insertId: 689644c30004cde066603b3a
      labels:
        instanceId: 0069c7a98846e3b870396a63478212b9642512ef362b67c33090846e10498949c671ccfefbc66f4f093796406e9a714bebc6fbb82f321578134ef95e56f9e9986c3265d2820b56f7994617ba7172ab
      logName: projects/PROJECT_ID/logs/run.googleapis.com%2Fstderr
      receiveTimestamp: '2025-08-08T18:41:07.632226222Z'
      resource:
        labels:
        ...
        type: cloud_run_revision
      textPayload: 'Ce-Type: google.cloud.workflows.workflow.v1.created'
      timestamp: '2025-08-08T18:41:07.314848Z'
      

    您已成功创建 Eventarc Advanced 总线和注册,启用了从 Google 来源发布事件,创建了用于从 Google 提供方生成受支持的事件类型的工作流,然后在事件接收器服务的日志中验证了预期结果。

    清理

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

    1. 删除 Artifact Registry 制品库

    2. 删除 Cloud Run 服务

    3. 删除 Workflows 工作流

    4. 删除 Eventarc Advanced 资源:

      1. 删除注册信息

      2. 删除流水线

      3. 删除总线

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

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

    后续步骤