使用 Cloud Audit Logs 接收事件 (gcloud CLI)

本快速入门介绍如何将 Google Kubernetes Engine (GKE) 服务设置为目标,以使用 Eventarc 接收来自 Cloud Storage 的事件。

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

  1. 设置一个服务账号,以便 Eventarc 可以拉取事件并将其转发到目标。
  2. 创建 Cloud Storage 存储桶作为事件来源。
  3. 创建 GKE 集群。
  4. 在 Eventarc 中初始化 GKE 目标。
  5. 部署接收事件的 GKE 服务。
  6. 创建 Eventarc 触发器,该触发器将 Cloud Storage 中的事件发送到 GKE 服务。
  7. 将文件上传到 Cloud Storage 存储桶以生成事件,并在 GKE Pod 日志中查看该事件。

准备工作

  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. 更新 Google Cloud CLI 组件:
    gcloud components update
  11. 启用 Eventarc、Resource Manager 和 Google Kubernetes Engine API:
    gcloud services enable eventarc.googleapis.com \
        cloudresourcemanager.googleapis.com \
        container.googleapis.com
  12. 设置本快速入门中使用的配置变量:
    PROJECT_ID=$(gcloud config get-value project)
    TRIGGER_SA=eventarc-sa
    CLUSTER_NAME=events-cluster
    SERVICE_NAME=hello-gke
  13. 如果您是项目创建者,则会被授予基本 Owner 角色 (roles/owner)。默认情况下,此 Identity and Access Management (IAM) 角色可提供完全访问大多数 Google Cloud 资源所需的权限,您可以跳过此步骤。

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

    所需权限

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

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

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

  14. 启用或使用包含 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)。但是,如果自动角色授予功能已停用,请参阅适用的角色和权限说明以创建新的服务账号并为其授予所需的角色。

  15. 将项目的 Pub/Sub Subscriber 角色 (roles/pubsub.subscriber) 授予 Compute Engine 默认服务账号,以便 Eventarc 触发器可以拉取事件。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/pubsub.subscriber
  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. 如果您在 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
  18. 对于 Google Cloud Storage,请为以下服务启用日志类型:管理员读取数据读取数据写入

    1. 读取您项目的 IAM 政策,并将其存储在一个文件中:
      gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
    2. 在“/tmp/policy.yaml”中修改政策,*仅*添加或更改数据访问审核日志配置。注意:您必须保留“bindings:”和“etag:”部分而不进行任何更改。否则可能导致您的项目不可用。
      auditConfigs:
        - auditLogConfigs:
          - logType: ADMIN_READ
          - logType: DATA_WRITE
          - logType: DATA_READ
          service: storage.googleapis.com
        bindings:
        - members:
          - user:EMAIL_ADDRESS
          role: roles/owner
        etag: BwW_bHKTV5U=
        version: 1
      EMAIL_ADDRESS 替换为您的电子邮件地址。
    3. 写入新的 IAM 政策:
      gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
      如果上述命令报告与其他更改发生冲突,请重复以上步骤(从读取项目的 IAM 政策开始)。

创建 Cloud Storage 存储桶

本快速入门使用 Cloud Storage 作为事件来源。创建 Cloud Storage 存储桶:

gsutil mb -l us-central1 gs://events-quickstart-$(gcloud config get-value project)/

创建事件来源后,您可以在 GKE 上部署事件接收器服务。

创建 GKE 集群

GKE 集群由至少一台集群控制平面计算机和多台称为节点的工作计算机组成。节点是运行 Kubernetes 进程的 Compute Engine 虚拟机 (VM) 实例,必须有这些进程,节点才能加入到集群中。您将应用部署到集群,该应用在节点上运行。

创建名为 events-cluster 的 Autopilot 集群:

gcloud container clusters create-auto $CLUSTER_NAME --region us-central1

集群创建可能需要几分钟才能完成。创建集群后,输出应类似于以下内容:

Creating cluster events-cluster...done.
Created [https://container.googleapis.com/v1/projects/MY_PROJECT/zones/us-central1/clusters/events-cluster].
[...]
STATUS: RUNNING

这将在 Google Cloud 项目 ID 为 MY_PROJECT 的项目中创建一个名为 events-cluster 的 GKE 集群。

启用 GKE 目标

对于以 GKE 服务为目标的每个触发器,Eventarc 会创建一个事件转发器组件,用于从 Pub/Sub 拉取事件并将其转发到目标。如需在 GKE 集群中创建组件和管理资源,请向 Eventarc 服务代理授予权限:

  1. 为 Eventarc 启用 GKE 目标:

    gcloud eventarc gke-destinations init
    
  2. 在系统提示绑定所需角色时,输入 y

    以下角色绑定到服务账号:

    • compute.viewer
    • container.developer
    • iam.serviceAccountAdmin

创建 GKE 服务目标

使用预构建的映像 gcr.io/cloudrun/hello 部署将接收和记录事件的 GKE 服务:

  1. Kubernetes 使用名为 kubeconfig 的 YAML 文件存储 kubectl 的集群身份验证信息。使用凭据和端点信息更新 kubeconfig 文件,以将 kubectl 指向 GKE 集群:

    gcloud container clusters get-credentials $CLUSTER_NAME \
        --region us-central1
    
  2. 创建 Kubernetes Deployment:

    kubectl create deployment $SERVICE_NAME \
        --image=gcr.io/cloudrun/hello
    
  3. 公开为 Kubernetes Service:

    kubectl expose deployment $SERVICE_NAME \
        --type ClusterIP --port 80 --target-port 8080
    

创建 Eventarc 触发器

当您将文件上传到 Cloud Storage 时,Eventarc 触发器会将 Cloud Storage 中的事件发送到 hello-gke GKE 服务。

  1. 创建 Cloud Audit Logs 触发器:

    gcloud eventarc triggers create my-gke-trigger \
        --location="us-central1" \
        --destination-gke-cluster="events-cluster" \
        --destination-gke-location="us-central1" \
        --destination-gke-namespace="default" \
        --destination-gke-service="hello-gke" \
        --destination-gke-path="/" \
        --event-filters="type=google.cloud.audit.log.v1.written" \
        --event-filters="serviceName=storage.googleapis.com" \
        --event-filters="methodName=storage.objects.create" \
        --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"
    

    这将创建一个名为 my-gke-trigger 的触发器。

  2. 确认触发器已成功创建:

    gcloud eventarc triggers list
    

    输出应类似如下所示:

    NAME: my-gke-trigger
    TYPE: google.cloud.audit.log.v1.written
    DESTINATION: GKE: hello-gke
    ACTIVE: By 20:39:43
    LOCATION: us-central1
    

生成并查看事件

将文本文件上传到 Cloud Storage 以生成事件并触发 GKE 服务。然后,您可以在 Pod 日志中查看事件的消息。

  1. 将文本文件上传到 Cloud Storage:

    echo "Hello World" > random.txt
    gsutil cp random.txt gs://events-quickstart-$(gcloud config get-value project)/random.txt

    上传操作会生成事件,而 GKE pod 会记录事件的消息。

  2. 要查看事件消息,请执行以下操作:

    1. 找到 Pod ID:

      kubectl get pods

      输出应类似如下所示:

      NAME                                         READY   STATUS             RESTARTS   AGE
      hello-gke-645964f578-2mjjt                   1/1     Running            0          35s

      复制 Pod 的 NAME 以在下一步使用。

    2. 查看 Pod 的日志:

      kubectl logs NAME

      NAME 替换为您复制的 Pod 名称。

    3. 查找类似如下的日志条目:

      2022/02/24 22:23:49 Hello from Cloud Run! The container started successfully and is listening for HTTP requests on $PORT
      {"severity":"INFO","eventType":"google.cloud.audit.log.v1.written","message":"Received event of type google.cloud.audit.log.v1.written. [...]}
      

清理

虽然当服务未在使用时 Cloud Run 不会产生费用,但您可能仍然需要为在 Container Registry 中存储容器映像Eventarc 资源Pub/Sub 消息GKE 集群付费。

您可以删除映像删除存储桶以及删除 GKE 集群

要删除 Eventarc 触发器,请运行以下命令:

gcloud eventarc triggers delete my-gke-trigger

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

gcloud projects delete PROJECT_ID_OR_NUMBER

PROJECT_ID_OR_NUMBER 替换为项目 ID 或编号。

后续步骤

使用 Pub/Sub 接收事件 (Google Cloud CLI)