使用 Cloud Audit Logs 接收事件 (gcloud CLI)
本快速入门介绍如何将 Google Kubernetes Engine (GKE) 服务设置为目标,以使用 Eventarc 接收来自 Cloud Storage 的事件。
在本快速入门中,您将执行以下操作:
- 设置一个服务账号,以便 Eventarc 可以拉取事件并将其转发到目标。
- 创建 Cloud Storage 存储桶作为事件来源。
- 创建 GKE 集群。
- 在 Eventarc 中初始化 GKE 目标。
- 部署接收事件的 GKE 服务。
- 创建 Eventarc 触发器,该触发器将 Cloud Storage 中的事件发送到 GKE 服务。
- 将文件上传到 Cloud Storage 存储桶以生成事件,并在 GKE Pod 日志中查看该事件。
准备工作
- 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
- 安装 Google Cloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init
-
-
创建 Google Cloud 项目:
gcloud projects create PROJECT_ID
将
PROJECT_ID
替换为您要创建的 Google Cloud 项目的名称。 -
选择您创建的 Google Cloud 项目:
gcloud config set project PROJECT_ID
将
PROJECT_ID
替换为您的 Google Cloud 项目 名称。
-
- 安装 Google Cloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init
-
-
创建 Google Cloud 项目:
gcloud projects create PROJECT_ID
将
PROJECT_ID
替换为您要创建的 Google Cloud 项目的名称。 -
选择您创建的 Google Cloud 项目:
gcloud config set project PROJECT_ID
将
PROJECT_ID
替换为您的 Google Cloud 项目 名称。
-
- 更新 Google Cloud CLI 组件:
gcloud components update
- 启用 Eventarc、Resource Manager 和 Google Kubernetes Engine API:
gcloud services enable eventarc.googleapis.com \ cloudresourcemanager.googleapis.com \ container.googleapis.com
- 设置本快速入门中使用的配置变量:
PROJECT_ID=$(gcloud config get-value project) TRIGGER_SA=eventarc-sa CLUSTER_NAME=events-cluster SERVICE_NAME=hello-gke
-
如果您是项目创建者,则会被授予基本 Owner 角色 (
roles/owner
)。默认情况下,此 Identity and Access Management (IAM) 角色可提供完全访问大多数 Google Cloud 资源所需的权限,您可以跳过此步骤。如果您不是项目创建者,则必须向主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。如需了解详情,请参阅事件目标位置的角色和权限页面。
所需权限
如需获得完成本快速入门所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
-
Eventarc Admin (
roles/eventarc.admin
) -
Kubernetes Engine Admin (
roles/container.admin
) -
Logs View Accessor (
roles/logging.viewAccessor
) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin
) -
Service Account Admin (
roles/iam.serviceAccountAdmin
) -
Service Account User (
roles/iam.serviceAccountUser
) -
Service Usage Admin (
roles/serviceusage.serviceUsageAdmin
) -
Storage Admin (
roles/storage.admin
)
如需详细了解如何授予角色,请参阅管理访问权限。
-
Eventarc Admin (
启用或使用包含 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
)。但是,如果自动角色授予功能已停用,请参阅适用的角色和权限说明以创建新的服务账号并为其授予所需的角色。- 将项目的 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
- 将项目的 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
- 如果您在 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
- 对于 Google Cloud Storage,请为以下服务启用日志类型:管理员读取、数据读取和数据写入:
- 读取您项目的 IAM 政策,并将其存储在一个文件中:
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
- 在“/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
替换为您的电子邮件地址。 - 写入新的 IAM 政策:
gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
如果上述命令报告与其他更改发生冲突,请重复以上步骤(从读取项目的 IAM 政策开始)。
- 读取您项目的 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 服务代理授予权限:
为 Eventarc 启用 GKE 目标:
gcloud eventarc gke-destinations init
在系统提示绑定所需角色时,输入
y
。以下角色绑定到服务账号:
compute.viewer
container.developer
iam.serviceAccountAdmin
创建 GKE 服务目标
使用预构建的映像 gcr.io/cloudrun/hello
部署将接收和记录事件的 GKE 服务:
Kubernetes 使用名为
kubeconfig
的 YAML 文件存储kubectl
的集群身份验证信息。使用凭据和端点信息更新kubeconfig
文件,以将kubectl
指向 GKE 集群:gcloud container clusters get-credentials $CLUSTER_NAME \ --region us-central1
创建 Kubernetes Deployment:
kubectl create deployment $SERVICE_NAME \ --image=gcr.io/cloudrun/hello
公开为 Kubernetes Service:
kubectl expose deployment $SERVICE_NAME \ --type ClusterIP --port 80 --target-port 8080
创建 Eventarc 触发器
当您将文件上传到 Cloud Storage 时,Eventarc 触发器会将 Cloud Storage 中的事件发送到 hello-gke
GKE 服务。
创建 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
的触发器。确认触发器已成功创建:
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 日志中查看事件的消息。
将文本文件上传到 Cloud Storage:
echo "Hello World" > random.txt gsutil cp random.txt gs://events-quickstart-$(gcloud config get-value project)/random.txt
上传操作会生成事件,而 GKE pod 会记录事件的消息。
要查看事件消息,请执行以下操作:
找到 Pod ID:
kubectl get pods
输出应类似如下所示:
NAME READY STATUS RESTARTS AGE hello-gke-645964f578-2mjjt 1/1 Running 0 35s
复制 Pod 的
NAME
以在下一步使用。查看 Pod 的日志:
kubectl logs NAME
将
NAME
替换为您复制的 Pod 名称。查找类似如下的日志条目:
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 集群付费。
要删除 Eventarc 触发器,请运行以下命令:
gcloud eventarc triggers delete my-gke-trigger
或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。
gcloud projects delete PROJECT_ID_OR_NUMBER
将 PROJECT_ID_OR_NUMBER
替换为项目 ID 或编号。