触发使用 Cloud Audit Logs 的工作流 (gcloud CLI)

本快速入门介绍如何使用从 BigQuery 接收 Cloud Audit Logs 事件的 Eventarc 触发器执行工作流。BigQuery 托管着公共数据集,您可以访问这些数据集并将其集成到自己的应用中。触发器通过监听查询公共数据集的 BigQuery 作业来执行工作流,然后将事件作为运行时参数传递给目标工作流。

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

  1. 使用 Workflows 创建和部署从事件中提取并返回数据的工作流。
  2. 创建 Eventarc 触发器以将 BigQuery 作业连接到 Workflows 事件接收器。
  3. 使用 bq 命令行工具运行 BigQuery 作业来生成事件。此事件会作为运行时参数传递到目标工作流。
  4. 查看工作流执行输出中的事件数据。

准备工作

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

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

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

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

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

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

      gcloud config set project PROJECT_ID

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

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. 安装 Google Cloud CLI。
  7. 如需初始化 gcloud CLI,请运行以下命令:

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

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

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

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

      gcloud config set project PROJECT_ID

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

  9. 确保您的 Google Cloud 项目已启用结算功能

  10. 更新 gcloud 组件:
    gcloud components update
  11. 使用您的账号登录:
    gcloud auth login
    
  12. 启用 Compute Engine、Eventarc、Pub/Sub 和 Workflows API。

    gcloud services enable \
    compute.googleapis.com \
    eventarc.googleapis.com \
    pubsub.googleapis.com \
    workflows.googleapis.com \
    workflowexecutions.googleapis.com
  13. 设置本快速入门中使用的配置变量:
    export WORKFLOW_LOCATION=us-central1
    export TRIGGER_LOCATION=us-central1
    export PROJECT_ID=PROJECT_ID
    gcloud config set project ${PROJECT_ID}
    gcloud config set workflows/location ${WORKFLOW_LOCATION}
    gcloud config set eventarc/location ${TRIGGER_LOCATION}
    
  14. 如果您是项目创建者,则会被授予基本 Owner 角色 (roles/owner)。默认情况下,此 Identity and Access Management (IAM) 角色可提供完全访问大多数 Google Cloud 资源所需的权限,您可以跳过此步骤。

    如果您不是项目创建者,则必须向主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。如需了解详情,请参阅事件目标位置的角色和权限页面。

    所需权限

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

    如需详细了解如何授予角色,请参阅管理访问权限

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

  15. 启用或使用包含 Compute Engine 的 Google Cloud 服务后,系统会自动创建 Compute Engine 默认服务账号

    为了进行测试,您可以将此服务账号附加到 Eventarc 触发器以表示该触发器的身份。请记下创建触发器时要使用的电子邮件地址格式:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。您可以在 Google Cloud 控制台的欢迎页面上或者通过运行以下命令找到项目编号:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    系统会自动向 Compute Engine 服务账号授予项目的基本 Editor 角色 (roles/editor)。但是,如果自动角色授予功能已停用,请参阅适用的角色和权限说明以创建新的服务账号并为其授予所需的角色。

  16. 将项目的 Eventarc Event Receiver 角色 (roles/eventarc.eventReceiver) 授予 Compute Engine 默认服务账号,以便 Eventarc 触发器可以接收来自事件提供程序的事件。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/eventarc.eventReceiver
  17. 将项目的 Workflows Invoker 角色 (roles/workflows.invoker) 授予 Compute Engine 默认服务账号,以便该账号有权触发您的工作流执行。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/workflows.invoker
  18. 将项目的 Logging Logs Writer 角色 (roles/logging.logWriter) 授予 Compute Engine 默认服务账号,以便工作流可以将日志发送到 Cloud 日志记录。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/logging.logWriter
  19. 如果您在 2021 年 4 月 8 日或之前启用了 Cloud Pub/Sub 服务代理,以支持经过身份验证的 Pub/Sub 推送请求,请向 Google 管理的服务账号授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator)。否则,系统会默认授予此角色:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator

创建和部署工作流

创建并部署一个工作流,该工作流在 BigQuery 作业完成通过 HTTP 请求触发工作流时执行。

  1. 打开终端或 Cloud Shell
  2. 在您的主目录中,创建一个名为 myFirstWorkflow.yamlmyFirstWorkflow.json 的新文件。
  3. 将以下项复制并粘贴到新文件中,然后保存:

    YAML

    main:
      params: [event]
      steps:
          - log_event:
              call: sys.log
              args:
                  text: ${event}
                  severity: INFO
          - extract_data:
              assign:
              - data: ${event.data.protoPayload}
          - return_data:
                  return:
                      data: ${data}

    JSON

    {
      "main": {
        "params": [
          "event"
        ],
        "steps": [
          {
            "log_event": {
              "call": "sys.log",
              "args": {
                "text": "${event}",
                "severity": "INFO"
              }
            }
          },
          {
            "extract_data": {
              "assign": [
                {
                  "data": "${event.data.protoPayload}"
                }
              ]
            }
          },
          {
            "return_data": {
              "return": {
                "data": "${data}"
              }
            }
          }
        ]
      }
    }
  4. 部署工作流:
    export MY_WORKFLOW=myFirstWorkflow
    gcloud workflows deploy ${MY_WORKFLOW} --source=myFirstWorkflow.yaml
    

    如果您复制了JSON 版示例工作流,请将 .yaml 替换为 .json

创建 Eventarc 触发器

如需创建 Eventarc 触发器以将事件从 BigQuery 路由到 Workflows 目标,请运行 gcloud eventarc triggers create 命令。

  1. 创建一个过滤 BigQuery 事件的触发器:

    gcloud eventarc triggers create events-cal-trigger \
        --destination-workflow=${MY_WORKFLOW} \
        --destination-workflow-location=${WORKFLOW_LOCATION} \
        --event-filters="type=google.cloud.audit.log.v1.written" \
        --event-filters="serviceName=bigquery.googleapis.com" \
        --event-filters="methodName=google.cloud.bigquery.v2.JobService.InsertJob" \
        --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"
    

    这将创建一个名为 events-cal-trigger 的触发器。

    请注意,首次在 Google Cloud 项目中创建 Eventarc 触发器时,预配 Eventarc 服务代理可能会有延迟。通常,您可以尝试再次创建触发器,以解决此问题。如需了解详情,请参阅权限遭拒错误

  2. 如需确认 events-cal-trigger 已成功创建,请运行以下命令:

    gcloud eventarc triggers describe events-cal-trigger --location=${TRIGGER_LOCATION}

    输出会列出触发器创建时间和位置,类似于以下内容:

    createTime: '2021-10-14T15:15:43.872360951Z'
    [...]
    name: projects/PROJECT_ID/locations/us-central1/triggers/events-cal-trigger
    

生成并查看事件

使用 bq 命令行工具运行 BigQuery 作业,以生成事件并触发工作流。

  1. 如要触发工作流,请运行访问公共数据集并从中检索信息的 BigQuery 作业:

    bq query --nouse_legacy_sql \
    'SELECT
    COUNT(*)
    FROM
    `bigquery-public-data`.samples.shakespeare'
    

    生成的事件作为运行时参数传递给工作流,工作流返回载荷数据作为工作流执行的结果。

  2. 如需验证工作流已触发,请列出其最后两次执行:

    gcloud workflows executions list ${MY_WORKFLOW} --limit=2
    

    BigQuery 作业会触发两个工作流执行。一个事件表示作业更改,另一个事件是作业插入本身。对于每个执行,输出列出了 NAME 和等于 SUCCEEDEDSTATE,类似如下内容:

    NAME: projects/218898424763/locations/us-central1/workflows/myFirstWorkflow/executions/a073ad6a-c76b-4437-8d39-2ab3ade289d2
    STATE: SUCCEEDED
    START_TIME: 2024-02-06T14:16:14.390549813Z
    END_TIME: 2024-02-06T14:16:14.870102511Z
    NAME: projects/218898424763/locations/us-central1/workflows/myFirstWorkflow/executions/35d7c730-7ba5-4055-afee-c04ed706b179
    STATE: SUCCEEDED
    START_TIME: 2024-02-06T14:16:14.389882601Z
    END_TIME: 2024-02-06T14:16:14.829942525Z

    请注意,在输出中,NAME 字段的 a073ad6a-c76b-4437-8d39-2ab3ade289d2 是工作流执行的 ID。复制您的执行 ID 以在下一步中使用。

  3. 如需查看执行状态,请运行以下命令:

    gcloud workflows executions describe WORKFLOW_EXECUTION_ID --workflow=${MY_WORKFLOW}
    

    WORKFLOW_EXECUTION_ID 替换为与 BigQuery 作业完成时间对应的工作流执行 ID。

    输出应类似如下所示:

    argument: [...]
    duration: 0.277917625s
    endTime: '2024-02-06T14:16:14.870102511Z'
    name: projects/218898424763/locations/us-central1/workflows/myFirstWorkflow/executions/a073ad6a-c76b-4437-8d39-2ab3ade289d2
    result: '{"data": [...]}'
    startTime: '2024-02-06T14:16:14.390549813Z'
    state: SUCCEEDED
  4. 验证 BigQuery 作业完成的 startTime 和工作流执行的 START_TIME 是否相互对应。

您已成功生成使用 Eventarc 触发了 Workflows 事件接收器的 BigQuery 事件。

清理

  1. 删除您创建的工作流:
    gcloud workflows delete ${MY_WORKFLOW}
    当系统询问您是否要继续时,请输入 y
  2. 删除您创建的触发器:
    gcloud eventarc triggers delete events-cal-trigger
  3. 或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。

    删除 Google Cloud 项目:

    gcloud projects delete PROJECT_ID

后续步骤