通过日志条目触发函数

Cloud Audit Logs 中会记录许多 Google Cloud 事件。您可以过滤这些日志,并使用接收器将其转发到 Pub/Sub 主题。然后,这些 Pub/Sub 主题可以发送通知来触发 Cloud Run functions。您可以通过任何生成审核日志的 Google Cloud 服务创建自定义事件。

本页面展示了一个示例,介绍了如何通过路由到 Pub/Sub 主题的日志条目触发函数。

Pub/Sub 触发的函数的事件结构

与所有由 Pub/Sub 触发的函数一样,由 Cloud Logging 日志条目触发的函数也会接收 PubsubMessage 对象,该对象的 data 参数是一个采用 base64 编码的字符串。对于 Cloud Logging 日志事件,将该值解码后,系统会以 JSON 字符串形式返回相关日志条目。

准备工作

示例代码会将 Cloud Audit Logs 转发到 Cloud Run 函数。在运行示例代码之前,您需要满足以下条件:

如需了解要启用的 API 以及部署由 Pub/Sub 触发的函数所需的角色,请参阅 Pub/Sub 触发器指南

示例代码

您可以使用由 Pub/Sub 触发的函数来检测导出的 Cloud Logging 日志并做出响应:

Node.js

exports.processLogEntry = data => {
  const dataBuffer = Buffer.from(data.data, 'base64');

  const logEntry = JSON.parse(dataBuffer.toString('ascii')).protoPayload;
  console.log(`Method: ${logEntry.methodName}`);
  console.log(`Resource: ${logEntry.resourceName}`);
  console.log(`Initiator: ${logEntry.authenticationInfo.principalEmail}`);
};

Python

import base64
import json

def process_log_entry(data, context):
    data_buffer = base64.b64decode(data["data"])
    log_entry = json.loads(data_buffer)["protoPayload"]

    print(f"Method: {log_entry['methodName']}")
    print(f"Resource: {log_entry['resourceName']}")
    print(f"Initiator: {log_entry['authenticationInfo']['principalEmail']}")

Go


// Package log contains examples for handling Cloud Functions logs.
package log

import (
	"context"
	"log"
)

// PubSubMessage is the payload of a Pub/Sub event.
// See the documentation for more details:
// https://cloud.google.com/pubsub/docs/reference/rest/v1/PubsubMessage
type PubSubMessage struct {
	Data []byte `json:"data"`
}

// ProcessLogEntry processes a Pub/Sub message from Cloud Logging.
func ProcessLogEntry(ctx context.Context, m PubSubMessage) error {
	log.Printf("Log entry data: %s", string(m.Data))
	return nil
}

Java


import com.google.cloud.functions.BackgroundFunction;
import com.google.cloud.functions.Context;
import functions.eventpojos.PubsubMessage;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.logging.Logger;

public class StackdriverLogging implements BackgroundFunction<PubsubMessage> {
  private static final Logger logger = Logger.getLogger(StackdriverLogging.class.getName());

  @Override
  public void accept(PubsubMessage message, Context context) {
    String name = "World";

    if (!message.getData().isEmpty()) {
      name = new String(Base64.getDecoder().decode(
          message.getData().getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8);
    }
    String res = String.format("Hello, %s", name);
    logger.info(res);
  }
}

部署和触发函数

如需在函数部署期间配置触发器,请执行以下操作:

  1. 在包含示例代码的目录中运行以下命令,以部署函数:

    Node.js

    gcloud beta run deploy nodejs-log-function \
          --source . \
          --function processLogEntry \
          --base-image nodejs20 \
          --region REGION
    

    Python

    gcloud beta run deploy python-log-function \
          --source . \
          --function process_log_entry \
          --base-image python312 \
          --region REGION
    

    Go

    gcloud beta run deploy go-log-function \
          --source . \
          --function ProcessLogEntry \
          --base-image go122 \
          --region REGION
    

    Java

    gcloud beta run deploy java-log-function \
          --source . \
          --function StackdriverLogging \
          --base-image java21 \
          --region REGION
    

    您需要进行如下替换:

    • REGION 替换为您要在其中部署函数的 Google Cloud 区域。例如 us-central1

    • --function 标志指定示例源代码中函数的入口点。这是 Cloud Run 在您的函数运行时执行的代码。此标志的值必须是源代码中存在的函数名称或完全限定类名称。

    • --base-image 标志指定函数的基础映像环境。如需详细了解基础映像以及每个映像中包含的软件包,请参阅运行时基础映像

  2. 运行以下命令可创建用于过滤事件的触发器:

    gcloud eventarc triggers create TRIGGER_NAME  \
        --location=EVENTARC_TRIGGER_LOCATION \
        --destination-run-service=SERVICE  \
        --destination-run-region=REGION \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    您需要进行如下替换:

    • TRIGGER_NAME 替换为触发器的名称。

    • EVENTARC_TRIGGER_LOCATION 替换为 Eventarc 触发器的位置。一般来说,Eventarc 触发器所在的位置应与您要监控事件的 Google Cloud 资源所在的位置一致。在大多数情况下,您还应在同一区域部署函数。如需详细了解 Eventarc 触发器位置,请参阅了解 Eventarc 位置

    • SERVICE 替换为您要部署的函数的名称。

    • REGION 替换为函数的 Cloud Run 区域

    • PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。 Eventarc 触发器与调用函数时用作身份的服务账号相关联。Eventarc 触发器的服务账号必须具有调用函数的权限。默认情况下,Cloud Run 使用默认计算服务账号。

    • --event-filters 标志用于指定触发器监控的事件过滤条件。与所有 event-filters 过滤条件匹配的事件会触发对函数的调用。每个触发器都必须具有受支持的事件类型。创建后,您无法更改事件过滤条件类型。如需更改事件过滤条件类型,您必须创建新的触发器并删除旧触发器。您可以酌情使用格式为 ATTRIBUTE=VALUE 的受支持过滤条件重复 --event-filters 标志来添加更多过滤条件。

Cloud 日志条目

当与您的某个过滤条件匹配的 Cloud 日志条目创建后,Google Cloud 控制台中与您的函数对应的日志条目应如下所示:

Method: METHOD
Resource: projects/YOUR_GCLOUD_PROJECT/...
Initiator: YOUR_EMAIL_ADDRESS