Acionar funções de entradas de registro

Muitos eventos do Google Cloud são registrados nos Registros de auditoria do Cloud. É possível filtrar esses registros e encaminhá-los para tópicos do Pub/Sub usando coletores. Esses tópicos do Pub/Sub podem acabar enviando notificações que acionam as funções do Cloud Run. É possível criar eventos personalizados em qualquer serviço do Google Cloud que produza registros de auditoria.

Esta página mostra um exemplo de como acionar funções de entradas de registro roteadas para um tópico do Pub/Sub.

Estrutura de eventos de funções acionadas pelo Pub/Sub

Como todas as funções acionadas pelo Pub/Sub, as funções acionadas pelas entradas de registro do Cloud Logging recebem um objeto PubsubMessage, cujo parâmetro data é uma string codificada com base64. Para eventos de registro do Cloud Logging, a decodificação desse valor retorna a entrada de registro relevante como uma string JSON.

Antes de começar

O código de exemplo encaminha os registros de auditoria do Cloud para uma função do Cloud Run. Antes de executar o código de exemplo, você vai precisar do seguinte:

Consulte o guia de acionadores do Pub/Sub para saber quais APIs ativar e quais papéis são necessários para implantar funções acionadas pelo Pub/Sub.

Código de amostra

É possível usar uma função acionada pelo Pub/Sub para detectar e responder a registros exportados do 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);
  }
}

Implantar e acionar uma função

Para configurar um gatilho durante a implantação da função:

  1. Execute o seguinte comando no diretório que contém o exemplo de código para implantar a função:

    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
    

    Substitua:

    • REGION pela região do Google Cloud em que você quer implantar a função. Por exemplo, us-central1.

    • A flag --function especifica o ponto de entrada da função no código-fonte de exemplo. Esse é o código que o Cloud Run executa quando a função é executada. O valor dessa sinalização precisa ser um nome de função ou de classe totalmente qualificada no código-fonte.

    • A flag --base-image especifica o ambiente de imagem base da sua função. Para mais detalhes sobre as imagens de base e os pacotes incluídos em cada imagem, consulte Imagens de base dos ambientes de execução.

  2. Execute o comando a seguir para criar um acionador que filtra eventos:

    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
    

    Substitua:

    • TRIGGER_NAME pelo nome do gatilho.

    • EVENTARC_TRIGGER_LOCATION com o local do gatilho do Eventarc. Em geral, o local de um acionador do Eventarc precisa corresponder ao local do recurso do Google Cloud que você quer monitorar para eventos. Na maioria dos cenários, você também precisa implantar a função na mesma região. Consulte Noções básicas sobre locais do Eventarc para mais detalhes sobre locais de acionador do Eventarc.

    • SERVICE pelo nome da função que você está implantando.

    • REGION pela região do Cloud Run da função.

    • PROJECT_NUMBER pelo número do projeto do Google Cloud. Os acionadores do Eventarc são vinculados a contas de serviço para usar como uma identidade ao invocar a função. A conta de serviço do acionador do Eventarc precisa ter permissão para invocar a função. Por padrão, o Cloud Run usa a conta de serviço de computação padrão.

    • A flag --event-filters especifica os filtros de evento que o acionador monitora. Um evento que corresponde a todos os filtros de event-filters aciona chamadas para sua função. Cada acionador precisa ter um tipo de evento compatível. Não é possível mudar o tipo de filtro de evento após a criação. Para mudar o tipo de filtro de evento, crie um novo gatilho e exclua o antigo. Opcionalmente, é possível repetir a flag --event-filters com um filtro compatível no formato ATTRIBUTE=VALUE para adicionar mais filtros.

Entrada de registro do Cloud

Quando uma entrada de registro do Cloud que corresponde a um dos seus filtros é criada, as entradas de registro correspondentes para sua função no console do Google Cloud ficam assim:

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