Este documento fornece exemplos que demonstram como receber e analisar notificações sobre alterações aos seus perfis de dados. A Proteção de dados confidenciais envia estas atualizações sob a forma de mensagens do Pub/Sub.
Vista geral
Pode configurar a proteção de dados confidenciais para gerar automaticamente perfis sobre dados numa organização, pasta ou projeto. Os perfis de dados contêm métricas e metadados sobre os seus dados e ajudam a determinar onde residem os dados confidenciais e de alto risco. A proteção de dados confidenciais comunica estas métricas a vários níveis de detalhe. Para obter informações sobre os tipos de dados que pode criar perfis, consulte o artigo Recursos suportados.
Ao configurar o perfilador de dados, pode ativar a opção para publicar mensagens do Pub/Sub sempre que ocorram alterações significativas nos seus perfis de dados. As mensagens ajudam a tomar medidas imediatas em resposta a essas alterações. Seguem-se os eventos que pode ouvir:
- Um recurso de dados é perfilado pela primeira vez.
 - Um perfil é atualizado.
 - Aumenta a pontuação de risco ou confidencialidade de um perfil.
 - Existe um novo erro relacionado com os seus perfis de dados.
 
As mensagens do Pub/Sub que o perfilador de dados publica contêm um objeto DataProfilePubSubMessage. Estas mensagens são sempre enviadas no formato binário, pelo que tem de escrever código que as receba e analise.
Preços
Quando usa o Pub/Sub, a faturação é feita de acordo com os preços do Pub/Sub.
Antes de começar
Esta página pressupõe o seguinte:
- Tem experiência na utilização do Pub/Sub. Para uma introdução, consulte o início rápido Publique e receba mensagens no Pub/Sub através da consola.
 - Já tem uma configuração de análise ao nível da organização, pasta ou projeto.
 - Tem experiência na configuração de Google Cloud bibliotecas de cliente.
 
Antes de começar a trabalhar nos exemplos, siga estes passos:
Crie um tópico do Pub/Sub e adicione uma subscrição para o mesmo. Não atribua um esquema ao tópico.
Para simplificar, os exemplos nesta página ouvem apenas uma subscrição. No entanto, na prática, pode criar um tópico e uma subscrição para cada evento que a proteção de dados confidenciais suporta.
Se ainda não o fez, configure o Perfilador de dados para publicar mensagens do Pub/Sub:
Edite a configuração da procura.
Na página Editar configuração de análise, ative a opção Publicar em Pub/Sub e selecione os eventos que quer ouvir. Em seguida, configure as definições para cada evento.
Guarde a configuração da análise.
Conceda ao agente do serviço de proteção de dados confidenciais acesso de publicação no tópico do Pub/Sub. Um exemplo de uma função que tem acesso à publicação é a função de publicador do Pub/Sub (
roles/pubsub.publisher). O agente do serviço de proteção de dados confidenciais é um endereço de email no formato:service-PROJECT_NUMBER@dlp-api.iam.gserviceaccount.comSe estiver a trabalhar com uma configuração de análise ao nível da organização ou da pasta, o PROJECT_NUMBER é o identificador numérico do contentor do agente do serviço. Se estiver a trabalhar com uma configuração de análise ao nível do projeto, o PROJECT_NUMBER é o identificador numérico do seu projeto.
Instale e configure a biblioteca cliente da proteção de dados confidenciais para Java ou Python.
Exemplos
Os exemplos seguintes demonstram como receber e analisar mensagens do Pub/Sub publicadas pelo Data Profiler. Pode reutilizar estes exemplos e implementá-los como funções do Cloud Run acionadas por eventos do Pub/Sub. Para mais informações, consulte o tutorial do Pub/Sub (2.ª geração).
Nos exemplos seguintes, substitua o seguinte:
- PROJECT_ID: o ID do projeto que contém a subscrição do Pub/Sub.
 - SUBSCRIPTION_ID: o ID da subscrição do Pub/Sub.
 
Java
import com.google.api.core.ApiService;
import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.privacy.dlp.v2.DataProfilePubSubMessage;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class DataProfilePubSubMessageParser {
  public static void main(String... args) throws Exception {
    String projectId = "PROJECT_ID";
    String subscriptionId = "SUBSCRIPTION_ID";
    int timeoutSeconds = 5;
    // The `ProjectSubscriptionName.of` method creates a fully qualified identifier
    // in the form `projects/{projectId}/subscriptions/{subscriptionId}`.
    ProjectSubscriptionName subscriptionName =
        ProjectSubscriptionName.of(projectId, subscriptionId);
    MessageReceiver receiver =
        (PubsubMessage pubsubMessage, AckReplyConsumer consumer) -> {
          try {
            DataProfilePubSubMessage message = DataProfilePubSubMessage.parseFrom(
                pubsubMessage.getData());
            System.out.println(
                "PubsubMessage with ID: " + pubsubMessage.getMessageId()
                    + "; message size: " + pubsubMessage.getData().size()
                    + "; event: " + message.getEvent()
                    + "; profile name: " + message.getProfile().getName()
                    + "; full resource: " + message.getProfile().getFullResource());
            consumer.ack();
          } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
          }
        };
    // Create subscriber client.
    Subscriber subscriber = Subscriber.newBuilder(subscriptionName, receiver).build();
    try {
      ApiService apiService = subscriber.startAsync();
      apiService.awaitRunning();
      System.out.printf("Listening for messages on %s for %d seconds.%n", subscriptionName,
          timeoutSeconds);
      subscriber.awaitTerminated(timeoutSeconds, TimeUnit.SECONDS);
    } catch (TimeoutException ignored) {
    } finally {
      subscriber.stopAsync();
    }
  }
}
Python
from google.cloud import pubsub_v1
from concurrent.futures import TimeoutError
from google.cloud import dlp_v2
project_id = "PROJECT_ID"
subscription_id = "SUBSCRIPTION_ID"
timeout = 5.0
subscriber = pubsub_v1.SubscriberClient()
# The `subscription_path` method creates a fully qualified identifier
# in the form `projects/{project_id}/subscriptions/{subscription_id}`
subscription_path = subscriber.subscription_path(project_id, subscription_id)
def callback(message: pubsub_v1.subscriber.message.Message) -> None:
    print(f"Received {message.data}.")
    dlp_msg = dlp_v2.DataProfilePubSubMessage()
    dlp_msg._pb.ParseFromString(message.data)
    print("Parsed message: ", dlp_msg)
    print("--------")
    message.ack()
streaming_pull_future = subscriber.subscribe(subscription_path, callback=callback)
print(f"Listening for messages on {subscription_path} for {timeout} seconds...")
# Wrap subscriber in a 'with' block to automatically call close() when done.
with subscriber:
    try:
        # When `timeout` is not set, result() will block indefinitely,
        # unless an exception is encountered first.
        streaming_pull_future.result(timeout=timeout)
    except TimeoutError:
        streaming_pull_future.cancel()  # Trigger the shutdown.
        streaming_pull_future.result()  # Block until the shutdown is complete.
        print("Done waiting.")
O que se segue?
- Saiba mais acerca dos perfis de dados.
 - Saiba como criar uma configuração de análise ao nível da organização, da pasta ou do projeto.
 - Siga um tutorial que demonstra como escrever, implementar e acionar uma função do Cloud Run simples baseada em eventos com um acionador do Pub/Sub.