Acionadores secundários com o Stackdriver

Muitos eventos do Google Cloud Platform são registrados nos registros de auditoria do Stackdriver. É possível filtrar esses logs e encaminhá-los para tópicos do Pub/Sub usando coletores. Esses tópicos do Pub/Sub podem acabar enviando notificações que acionam o Cloud Functions. Isso permite que você crie eventos personalizados a partir de qualquer serviço do Google Cloud Platform que produza registros de auditoria.

Configuração

Para executar a amostra abaixo, será necessário um tópico do Pub/Sub e um coletor do Stackdriver Logging. A amostra os usa para encaminhar registros de auditoria do Stackdriver para uma das Cloud Functions.

Estrutura do evento

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

Código de amostra

É possível usar uma função acionada pelo Pub/Sub como a abaixo para detectar e responder a registros exportados do Stackdriver:

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.
type PubSubMessage struct {
	Data []byte `json:"data"`
}

// ProcessLogEntry processes a Pub/Sub message from Stackdriver.
func ProcessLogEntry(ctx context.Context, m PubSubMessage) error {
	log.Printf("Log entry data: %s", string(m.Data))
	return nil
}

Como implantar uma função

Use o comando abaixo para implantar a função:

Node.js

gcloud functions deploy processLogEntry --runtime nodejs8 --trigger-topic YOUR_PUBSUB_TOPIC
Os seguintes valores podem ser usados para a sinalização --runtime para usar versões diferentes do Node.js:
  • nodejs6 (obsoleto)
  • nodejs8
  • nodejs10 (beta)

Python

gcloud functions deploy process_log_entry --runtime python37 --trigger-topic YOUR_PUBSUB_TOPIC

Go

gcloud functions deploy ProcessLogEntry --runtime go111 --trigger-topic YOUR_PUBSUB_TOPIC

Como acionar uma função

Quando uma entrada de registro do Stackdriver que corresponde a um de seus filtros é criada, você deve ver entradas de registro correspondentes para sua função:

Method: METHOD
Resource: projects/YOUR_GCLOUD_PROJECT/...
Initiator: YOUR_EMAIL_ADDRESS
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Cloud Functions