Acionar funções de entradas de registro

Os Registros de auditoria do Cloud registram eventos em vários serviços do Google Cloud . Usando coletores, é possível filtrar esses registros e encaminhá-los para tópicos do Pub/Sub que acionam funções do Cloud Run. Isso permite que você responda a eventos de qualquer serviço doGoogle Cloud que produza registros de auditoria.

Nesta página, mostramos um exemplo de como invocar funções de entradas de registro roteadas para um tópico do Pub/Sub. Este tutorial usa gatilhos do Eventarc, mas também é possível usar gatilhos diretos do Pub/Sub ao acionar a função.

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

As funções acionadas por entradas de registro do Cloud Logging recebem um objeto PubsubMessage com o parâmetro data como uma string codificada em 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 exemplo de código encaminha os Registros de Auditoria do Cloud para uma função do Cloud Run. Antes de executar o exemplo de código, você vai precisar do seguinte:

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

Exemplo de código

É 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 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
    

    Substitua:

    • REGION: a Google Cloud região em que você quer implantar a função. Por exemplo, europe-west1.
    • A flag --function especifica o ponto de entrada para a função no exemplo de código-fonte. Esse é o código que o Cloud Run executa quando é 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 gatilho que filtre 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" \
        --transport-topic=projects/PROJECT_ID/topics/TOPIC_NAME \
        --service-account=PROJECT_NUMBER-compute@
    

    Substitua:

    • TRIGGER_NAME: o nome do gatilho.
    • EVENTARC_TRIGGER_LOCATION: o local do gatilho do Eventarc. Em geral, o local de um gatilho do Eventarc precisa corresponder ao local do recurso doGoogle 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: o nome da função que você está implantando.
    • REGION: a região do Cloud Run em que você implantou a função.
    • PROJECT_NUMBER: o número do projeto do Google Cloud . Os gatilhos 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 padrão do Compute.
    • A flag --event-filters especifica os filtros de evento que o gatilho monitora. Quando um evento corresponde a todos os filtros de evento, ele aciona uma chamada para sua função. Cada gatilho 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, é necessário criar um novo gatilho e excluir o antigo. Opcional: é possível repetir a flag --event-filters com um filtro compatível no formato ATTRIBUTE=VALUE para adicionar mais filtros.
    • TOPIC_NAME: o nome do tópico do Pub/Sub que recebe os eventos de entrada de registro.
    • A flag --transport-topic especifica o tópico do Pub/Sub que o Eventarc usa para transportar eventos para sua função. Essa flag não é obrigatória se você não tiver criado um tópico do Pub/Sub.

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 da sua função no console doGoogle Cloud devem ser assim:

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