Cloud Logging으로 2차 트리거

많은 Google Cloud Platform 이벤트가 Cloud 감사 로그에 로깅됩니다. 이러한 로그를 필터링하고 싱크를 사용하여 Pub/Sub 주제로 전달할 수 있습니다. 그런 다음 이러한 Pub/Sub 주제가 Cloud Functions를 트리거하는 알림을 전송할 수 있습니다. 또한 감사 로그를 생성하는 모든 Google Cloud Platform 서비스에서 커스텀 이벤트를 만들 수도 있습니다.

구성

아래 샘플을 실행하려면 Pub/Sub 주제Cloud Logging 싱크가 필요합니다. 이 샘플에서는 이들을 사용하여 Cloud 감사 로그를 Cloud 함수에 전달합니다.

이벤트 구조

모든 Pub/Sub 트리거 함수와 마찬가지로, Cloud 로그 항목에 의해 트리거된 함수는 PubsubMessage 객체를 수신하며 data 매개변수는 base64로 인코딩된 문자열입니다. Cloud 로그 이벤트의 경우 이 값을 디코딩하면 관련 로그 항목이 JSON 문자열로 반환됩니다.

샘플 코드

아래와 같은 Pub/Sub 트리거 함수를 사용하면 내보낸 Cloud 로그를 감지하고 로그에 응답할 수 있습니다.

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
}

자바


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);
  }
}

함수 배포

아래 명령어를 사용하여 함수를 배포합니다.

Node.js

gcloud functions deploy processLogEntry \
--runtime nodejs20 \
--trigger-topic YOUR_PUBSUB_TOPIC

--runtime 플래그를 사용하여 함수를 실행할 지원되는 Node.js 버전의 런타임 ID를 지정합니다.

Python

gcloud functions deploy process_log_entry \
--runtime python312 \
--trigger-topic YOUR_PUBSUB_TOPIC

--runtime 플래그를 사용하여 함수를 실행할 지원되는 Python 버전의 런타임 ID를 지정합니다.

Go

gcloud functions deploy ProcessLogEntry \
--runtime go121 \
--trigger-topic YOUR_PUBSUB_TOPIC

--runtime 플래그를 사용하여 함수를 실행할 지원되는 Go 버전의 런타임 ID를 지정합니다.

Java

gcloud functions deploy java-log-function \
--entry-point StackdriverLogging \
--runtime java17 \
--memory 512MB \
--trigger-topic YOUR_PUBSUB_TOPIC

--runtime 플래그를 사용하여 함수를 실행할 지원되는 Java 버전의 런타임 ID를 지정합니다.

함수 트리거

필터 중 하나와 일치하는 Cloud 로그 항목이 만들어지면 함수의 해당 로그 항목이 표시됩니다.

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