透過記錄項目觸發函式

許多 Google Cloud 事件都會記錄在 Cloud 稽核記錄中。您可以篩選這些記錄,並使用接收器將其轉送至 Pub/Sub 主題。之後 Pub/Sub 主題可傳送通知,以觸發 Cloud Run 函式。您可以透過產生稽核記錄的任何 Google Cloud 服務建立自訂事件。

本頁面提供範例,說明如何從轉送至 Pub/Sub 主題的記錄項目觸發函式。

由 Pub/Sub 觸發的函式事件結構

和所有 Pub/Sub 觸發函式一樣,由 Cloud Logging 記錄項目觸發的函式會收到 PubsubMessage 物件,這個物件的 data 參數是採 base64 編碼的字串。對於 Cloud Logging 記錄事件,解碼此值會以 JSON 字串傳回相關記錄項目。

事前準備

範例程式碼會將 Cloud 稽核記錄轉送至 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 run deploy nodejs-log-function \
          --source . \
          --function processLogEntry \
          --base-image nodejs20 \
          --region REGION
    

    Python

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

    Go

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

    Java

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

    取代:

    • REGION,其中 Google Cloud是您要部署函式的地區。例如:europe-west1

    • --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 會使用預設的 Compute 服務帳戶。

    • --event-filters 標記會指定觸發條件監控的事件篩選器。如果事件符合所有 event-filters 篩選條件,就會觸發函式呼叫。每個觸發條件都必須有支援的事件類型。建立事件篩選器後,即無法變更類型。如要變更事件篩選器類型,請建立新觸發條件並刪除舊觸發條件。視需要重複使用 --event-filters 旗標和表單 ATTRIBUTE=VALUE 中的支援篩選器,新增更多篩選器。

Cloud 記錄項目

如果系統建立了符合其中一個篩選條件的 Cloud 記錄項目,Google Cloud 控制台中函式的對應記錄項目應如下所示:

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