로그 항목에서 함수 트리거

많은 Google Cloud 이벤트가 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 감사 로그를 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
}

자바


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
    

    자바

    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 트리거는 함수를 호출할 때 ID로 사용할 서비스 계정에 연결됩니다. 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