发布来自 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. 登录您的 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、Cloud Build、Cloud Run、Eventarc 和 Workflows API:

    启用 API 所需的角色

    如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (roles/serviceusage.serviceUsageAdmin),该角色包含 serviceusage.services.enable 权限。了解如何授予角色

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com eventarc.googleapis.com eventarcpublishing.googleapis.com run.googleapis.com workflows.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、Cloud Build、Cloud Run、Eventarc 和 Workflows API:

    启用 API 所需的角色

    如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (roles/serviceusage.serviceUsageAdmin),该角色包含 serviceusage.services.enable 权限。了解如何授予角色

    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. 出于测试目的,请创建一个服务账号,并向其授予完成本快速入门所需的角色。
    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 的访问权限控制

将事件接收器服务部署到 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 \
        --service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --default-buckets-behavior=regional-user-owned-bucket
  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 项目后,系统会停止对该项目中使用的所有资源计费。

删除 Google Cloud 项目:

gcloud projects delete PROJECT_ID

后续步骤