Acione funções a partir de entradas do registo

Muitos Google Cloud eventos são registados nos registos de auditoria do Cloud. Pode filtrar estes registos e encaminhá-los para tópicos do Pub/Sub através de destinos. Estes tópicos do Pub/Sub podem, em seguida, enviar notificações que acionam funções do Cloud Run. Pode criar eventos personalizados a partir de qualquer serviço que produza registos de auditoria. Google Cloud

Esta página mostra um exemplo de como acionar funções a partir de entradas de registo encaminhadas para um tópico Pub/Sub.

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

Tal como todas as funções acionadas pelo Pub/Sub, as funções acionadas por entradas de registo do Cloud Logging recebem um objeto PubsubMessage cujo parâmetro data é uma string codificada em base64. Para eventos de registo do Cloud Logging, a descodificação deste valor devolve a entrada de registo relevante como uma string JSON.

Antes de começar

O código de exemplo encaminha os registos de auditoria do Cloud para uma função do Cloud Run. Antes de executar o código de exemplo, precisa do seguinte:

Consulte o guia de acionadores do Pub/Sub para ver as APIs a ativar e as funções necessárias para implementar funções acionadas pelo Pub/Sub.

Exemplo de código

Pode usar uma função acionada pelo Pub/Sub para detetar e responder a registos do Cloud Logging exportados:

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']}")

Ir


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

Implemente e acione uma função

Para configurar um acionador durante a implementação da função:

  1. Execute o seguinte comando no diretório que contém o código de exemplo para implementar a sua 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
    

    Ir

    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
    

    Substituir:

    • REGION com a Google Cloud região onde quer implementar a sua função. Por exemplo, europe-west1.

    • A flag --function especifica o ponto de entrada para a função no código fonte de exemplo. Este é o código que o Cloud Run executa quando a sua função é executada. O valor desta flag tem de ser um nome de função ou um nome de classe totalmente qualificado que exista no seu código-fonte.

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

  2. Execute o seguinte comando 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
    

    Substituir:

    • TRIGGER_NAME com o nome do acionador.

    • EVENTARC_TRIGGER_LOCATION com a localização do acionador do Eventarc. Em geral, a localização de um acionador do Eventarc deve corresponder à localização do Google Cloud recurso que quer monitorizar para eventos. Na maioria dos cenários, também deve implementar a função na mesma região. Consulte o artigo Compreender as localizações do Eventarc para ver mais detalhes sobre as localizações dos acionadores do Eventarc.

    • SERVICE com o nome da função que está a implementar.

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

    • PROJECT_NUMBER com o seu Google Cloud número do projeto. Os acionadores do Eventarc estão associados a contas de serviço para serem usados como uma identidade quando invocam a sua função. A conta de serviço do seu acionador do Eventarc tem de ter autorização para invocar a sua função. Por predefinição, o Cloud Run usa a conta de serviço de computação predefinida.

    • A flag --event-filters especifica os filtros de eventos que o acionador monitoriza. Um evento que corresponde a todos os event-filters, filtros aciona chamadas para a sua função. Cada acionador tem de ter um tipo de evento suportado. Não pode alterar o tipo de filtro de eventos após a criação. Para alterar o tipo de filtro de eventos, tem de criar um novo acionador e eliminar o antigo. Opcionalmente, pode repetir a flag --event-filters com um filtro suportado no formulário ATTRIBUTE=VALUE para adicionar mais filtros.

Entrada do registo na nuvem

Quando é criada uma entrada de registo da nuvem que corresponde a um dos seus filtros, as entradas de registo correspondentes para a sua função na Google Cloud consola devem ter o seguinte aspeto:

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