本教程演示了如何使用 Cloud Audit Logs 触发器编写、部署和触发事件驱动型 Cloud Functions 函数。
Cloud Functions (第 2 代) 中的一项独特功能是,您的函数可以由 Cloud Audit Logs 条目触发。当发生重要的产品内操作时,许多 Google Cloud 产品都会向 Cloud Audit Logs 写入数据。这些日志条目可以实时触发 Cloud Functions 函数的执行,从而允许用户自动处理该函数和/或对其执行操作。
这些日志由 Google Cloud 中的许多不同事件生成,并且涵盖大多数 Google Cloud 产品。因此,Cloud Audit Logs 触发器使您能够创建函数来响应 Google Cloud 中的大多数状态更改。
本教程介绍了如何使用 Cloud Audit Logs 触发器为新创建的 Compute Engine 实例添加创建它们的实体(个人或服务账号)的名称标签。
如果您刚接触 Cloud Audit Logs,并且希望了解更多有关该产品的信息,请参阅 Cloud Audit Logs 文档。
目标
- 编写事件驱动型 Cloud Functions 函数,以便在创建 Compute Engine 虚拟机实例时接收 Cloud Audit Logs 事件。
- 通过创建 Compute Engine 虚拟机实例来触发该函数,此时该实例标有创建它的实体(个人或服务账号)的名称。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- Cloud Functions
- Cloud Build
- Pub/Sub
- Artifact Registry
- Eventarc
- Cloud Logging
- Compute Engine
For details, see Cloud Functions pricing.
准备工作
- 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Cloud Functions, Cloud Run, Cloud Build, Artifact Registry, Eventarc, Logging, Compute Engine, and Pub/Sub APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Cloud Functions, Cloud Run, Cloud Build, Artifact Registry, Eventarc, Logging, Compute Engine, and Pub/Sub APIs.
- 安装并初始化 Cloud SDK。
- 更新
gcloud
组件: - 准备开发环境。
gcloud components update
需要命令提示符吗?您可以使用 Google Cloud Shell。Google Cloud Shell 命令行环境已经包含 Google Cloud SDK,因此您无需再进行安装。Google Compute Engine 虚拟机也预装了 Google Cloud SDK。
前提条件
在 Google Cloud 控制台中打开 IAM 和管理 > 审核日志页面:
为 Compute Engine API 启用 Cloud Audit Logs 管理员读取、数据读取和数据写入日志类型:
检查 Compute Engine 服务账号是否具有
Editor
角色。此服务账号将用作 Cloud Functions 的服务身份。找到表中的条目
PROJECT_NUMBER-compute@developer.gserviceaccount.com
并查看Roles
列。如果列包含Editor
,则可以跳过以下步骤。否则,请转到下一步,并将必要的角色分配给服务账号。向项目的 Compute Engine 服务账号授予
eventarc.eventReceiver
角色:PROJECT_ID=$(gcloud config get-value project) PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)') # Allow service account token creation gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role roles/eventarc.eventReceiver
将
run.invoker
角色授予项目的 Compute Engine 服务账号,以便 Pub/Sub 触发器可以执行该函数:PROJECT_ID=$(gcloud config get-value project) PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)') # Allow service account token creation gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role roles/run.invoker
将
compute.instanceAdmin
角色授予项目的 Compute Engine 服务账号,以便函数代码具有获取虚拟机实例并为其设置标签所需的权限:PROJECT_ID=$(gcloud config get-value project) PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)') # Allow service account token creation gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role roles/compute.instanceAdmin
准备应用
将示例应用代码库克隆到本地机器:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
切换到 Cloud Functions 示例代码所在的目录,以便访问 Cloud Audit Logs:
Node.js
cd nodejs-docs-samples/functions/v2/autoLabelInstance/
Python
cd python-docs-samples/functions/v2/label_gce_instance/
Go
cd golang-samples/functions/functionsv2/label_gce_instance/
Java
cd java-docs-samples/functions/v2/label-compute-instance/
查看示例代码:
Node.js
Python
Go
Java
部署函数
如需使用 Cloud Audit Logs 触发器部署函数,请在包含示例代码(如果是 Java 则为 pom.xml
文件)的目录中运行以下命令:
Node.js
gcloud functions deploy nodejs-cal-function \ --gen2 \ --runtime=nodejs20 \ --region=REGION
\ --source=. \ --entry-point=autoLabelInstance \
--trigger-location=REGION
\
--trigger-event-filters="type=google.cloud.audit.log.v1.written" \
--trigger-event-filters="serviceName=compute.googleapis.com" \
--trigger-event-filters="methodName=v1.compute.instances.insert"
使用 --runtime
标志可以指定支持的 Node.js 版本的运行时 ID 来运行您的函数。
Python
gcloud functions deploy python-cal-function \ --gen2 \ --runtime=python312 \ --region=REGION
\ --source=. \ --entry-point=label_gce_instance \
--trigger-location=REGION
\
--trigger-event-filters="type=google.cloud.audit.log.v1.written" \
--trigger-event-filters="serviceName=compute.googleapis.com" \
--trigger-event-filters="methodName=v1.compute.instances.insert"
使用 --runtime
标志可以指定支持的 Python 版本的运行时 ID 来运行您的函数。
Go
gcloud functions deploy go-cal-function \ --gen2 \ --runtime=go121 \ --region=REGION
\ --source=. \ --entry-point=label-gce-instance \
--trigger-location=REGION
\
--trigger-event-filters="type=google.cloud.audit.log.v1.written" \
--trigger-event-filters="serviceName=compute.googleapis.com" \
--trigger-event-filters="methodName=v1.compute.instances.insert"
Java
gcloud functions deploy java-cal-function \ --gen2 \ --runtime=java17 \ --region=REGION
\ --source=. \ --entry-point=functions.AutoLabelInstance \ --memory=512MB \
--trigger-location=REGION
\
--trigger-event-filters="type=google.cloud.audit.log.v1.written" \
--trigger-event-filters="serviceName=compute.googleapis.com" \
--trigger-event-filters="methodName=v1.compute.instances.insert"
使用 --runtime
标志可以指定支持的 Java 版本的运行时 ID 来运行您的函数。
上面的部署命令指定了与所创建的虚拟机对应的以下事件过滤条件参数:
type
:Cloud Audit Logs 事件类型 (google.cloud.audit.log.v1.written
)。serviceName
:生成日志条目的 Google Cloud 服务的名称,在本示例中为compute.googleapis.com
。methodName
:生成日志条目的 API 方法的名称,在本示例中为v1.compute.instances.insert
。
触发函数
函数部署后,您可以确认其是否正常运行:
创建 Compute Engine 虚拟机实例:
gcloud compute instances create
YOUR_INSTANCE_NAME
--zoneYOUR_ZONE
或者,转到 Google Cloud 控制台,然后点击创建虚拟机。
运行以下命令来验证实例是否已正确添加标签:
gcloud compute instances describe
YOUR_INSTANCE_NAME
\ --zoneYOUR_ZONE \ --format 'value(labels)'
您应该会看到格式为
creator=YOURNAMEYOUR_DOMAIN
的标签。
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- 在 Google Cloud 控制台中,进入管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。
删除 Cloud Functions 函数
删除 Cloud Functions 函数不会移除存储在 Cloud Storage 中的任何资源。
如需删除您在本教程中创建的 Cloud Functions 函数,请运行以下命令:
Node.js
gcloud functions delete nodejs-cal-function --gen2 --region REGION
Python
gcloud functions delete python-cal-function --gen2 --region REGION
Go
gcloud functions delete go-cal-function --gen2 --region REGION
Java
gcloud functions delete java-cal-function --gen2 --region REGION
您也可以通过 Google Cloud 控制台删除 Cloud Functions 函数。
删除 Compute Engine 虚拟机实例
如需删除您在本教程中创建的 Compute Engine 虚拟机实例,请运行以下命令:
gcloud compute instances deleteYOUR_INSTANCE_NAME
--zoneYOUR_ZONE