将事件发布到 BigQuery 表

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

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

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

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

  1. 创建 BigQuery 表。

  2. 创建 Eventarc Advanced 总线。

  3. 创建 Eventarc Advanced 注册。

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

  5. 在 BigQuery 表中查看事件数据。

您可以使用 gcloud CLI 和 bq 命令行工具完成此快速入门。

准备工作

您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅 在受限的环境中开发应用 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. 启用 BigQuery 和 Eventarc API:

    启用 API 所需的角色

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

    gcloud services enable bigquery.googleapis.com eventarc.googleapis.com eventarcpublishing.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. 启用 BigQuery 和 Eventarc API:

    启用 API 所需的角色

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

    gcloud services enable bigquery.googleapis.com eventarc.googleapis.com eventarcpublishing.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 账号(针对最终用户)或服务帐号(针对应用和计算工作负载)。

    所需权限

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

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

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

  18. 如需为 Eventarc Advanced 授予更新 BigQuery 表属性所需的权限,请让管理员向服务帐号授予项目的 BigQuery Data Editor (roles/bigquery.dataEditor) IAM 角色:
      Google Cloud
    1. 创建一个服务帐号。为了进行测试,您将此服务账号附加到 Eventarc Advanced 流水线以表示该流水线的身份。
      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      SERVICE_ACCOUNT_NAME 替换为您的服务帐号的名称。
    2. 向服务帐号授予 roles/bigquery.dataEditor IAM 角色:
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \
          --role=roles/bigquery.dataEditor

创建 BigQuery 表

创建 BigQuery 表作为您的 事件目的地。系统还支持其他事件目的地,例如 Pub/Sub 主题、Workflows 或其他 HTTP 端点。如需了解详情,请参阅 事件提供方和目的地

在创建 BigQuery 表之前,请先创建 数据集(充当 表的顶级容器)和表 架构

  1. 如需创建新数据集,请使用带有 --dataset 标志的 bq mk 命令。

    bq --location=$REGION mk --dataset DATASET_ID

    DATASET_ID 替换为 BigQuery 数据集的唯一名称,例如 my_dataset

  2. 在终端中,创建一个名为 my-schema.json 的新文件。

  3. 将以下架构复制并粘贴到新文件中,然后保存该文件。

    [
        {
            "name": "name",
            "type": "STRING",
            "mode": "REQUIRED"
        },
        {
            "name": "age",
            "type": "INTEGER",
            "mode": "NULLABLE"
        }
    ]
  4. 如需创建表,请使用带有 --table 标志的 bq mk 命令。

    bq mk --table PROJECT_ID:DATASET_ID.TABLE_ID my-schema.json

    TABLE_ID 替换为 BigQuery 表的唯一名称,例如 my-table

创建 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 注册

注册可确定哪些消息会路由到目的地,并指定用于为事件消息配置目的地的流水线。在本例中,目标目的地是 BigQuery API 端点

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

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

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

    gcloud eventarc pipelines create PIPELINE_NAME \
        --destinations=http_endpoint_uri='https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID/insertAll',http_endpoint_message_binding_template='{"headers": headers.merge({"content-type":"application/json"}), "body": {"rows":[{"json":message.data}]}}',oauth_token_authentication_service_account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --input-payload-format-json= \
        --location=$REGION

    PIPELINE_NAME 替换为流水线的 ID 或完全限定名称,例如 my-pipeline

    请注意以下几点:

    • http_endpoint_message_binding_template 键会将事件转换为 API 期望的格式。定义消息绑定时,您必须配置输入格式才能访问载荷。
    • oauth_token_authentication_service_account 键用于指定服务账号电子邮件。此电子邮件用于生成 OAuth 令牌,通常,只有在调用 *.googleapis.com上托管的 Google API 时,才应使用该令牌。
    • input-payload-format-json 标志用于指定流水线的输入 载荷格式为 JSON;任何与此格式不匹配的消息都会被视为 永久性错误
  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

    替换以下内容:

向总线发布事件消息

如需直接向总线发布消息,您可以使用 gcloud eventarc message-buses publish 命令,也可以向 Eventarc Publishing REST API发送请求。 如需了解详情,请参阅 直接发布事件

消息必须采用 CloudEvents 格式,这是一种以通用方式描述事件数据的规范。data 元素是事件的载荷,它最终必须与 BigQuery 表的架构匹配。任何格式正确的 JSON 都可以放入此字段。如需详细了解 CloudEvents 上下文属性,请参阅 事件格式

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

示例 1

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

gcloud eventarc message-buses publish BUS_NAME \
    --event-data='{"name": "my-name", "age": "20"}' \
    --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":
 {"name": "my-name", "age": "20"}}'

发布事件后,您应该会收到“事件发布成功”消息。

在 BigQuery 表中查看事件数据

向 Eventarc Advanced 总线发布事件后,您可以 使用 bq query 命令 确认是否已向 BigQuery 表添加新行。

bq query \
    --use_legacy_sql=false \
    'SELECT
      *
    FROM
      `PROJECT_ID.DATASET_ID.TABLE_ID`
    LIMIT
      10;'

您已成功创建 Eventarc Advanced 总线和注册,向总线发布事件消息,并通过查询 BigQuery 表验证了预期结果。

清理

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

  1. 删除 BigQuery 表

  2. 删除 BigQuery 数据集

  3. 删除 Eventarc Advanced 资源:

    1. 删除注册

    2. 删除流水线

    3. 删除总线

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

删除项目: Google Cloud

gcloud projects delete PROJECT_ID

后续步骤