Criar um tópico com SMTs

Este documento explica como criar um tópico do Pub/Sub com transformações de mensagem única (SMTs).

As SMTs de tópico permitem modificações leves nos dados e atributos das mensagens diretamente no Pub/Sub. Esse recurso permite a limpeza de dados, filtragem ou conversão de formato antes que as mensagens sejam publicadas no tópico.

Para criar um tópico com SMTs, use o Google Cloud console, a Google Cloud CLI, a biblioteca de cliente ou a API Pub/Sub.

Antes de começar

Papéis e permissões necessárias

Para receber as permissões necessárias para criar um tópico com SMTs, peça ao administrador para conceder a você o papel do IAM de Editor do Pub/Sub (roles/pubsub.editor) no projeto. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Esse papel predefinido contém as permissões necessárias para criar um tópico com SMTs. Para acessar as permissões exatas que são necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

As permissões a seguir são necessárias para criar um tópico com SMTs:

  • Conceda a permissão de criar um tópico no projeto: pubsub.topics.create

Essas permissões também podem ser concedidas com funções personalizadas ou outros papéis predefinidos.

É possível configurar o controle de acesso no nível do projeto e no nível do recurso individual.

Criar um tópico com SMTs

Antes de criar um tópico com SMTs, revise a documentação para Propriedades de um tópico.

Para criar um Pub/Sub com uma ou mais SMTs, siga estas etapas. É possível ativar até cinco SMTs por tópico.

Console

  1. No Google Cloud console, acesse a página Tópicos do Pub/Sub.

    Acesse Tópicos

  2. Selecione Criar tópico.

  3. No campo ID do tópico, insira um ID para o tópico. Para mais informações sobre como nomear tópicos, consulte as diretrizes de nomenclatura.

  4. Em Transformações, clique em Adicionar uma transformação.

  5. Selecione o Tipo de transformação. Para mais informações sobre os tipos de SMT compatíveis, consulte Tipos de SMTs.

  6. Defina as propriedades de configuração da SMT. O conjunto de propriedades depende do tipo de SMT. Para mais informações, consulte a documentação desse tipo de SMT.

  7. Opcional. Para validar a SMT, clique em Validar. Se a SMT for válida, a mensagem "Validation passed" será exibida. Caso contrário, uma mensagem de erro será exibida.

  8. Para adicionar outra transformação, clique em Adicionar uma transformação e repita as etapas anteriores.

    Para organizar as SMTs em uma ordem específica, clique em Mover para cima ou Mover para baixo. Para remover uma SMT, clique em Excluir.

  9. Opcional. Para testar uma SMT em uma mensagem de amostra, siga estas etapas:

    1. Clique em Testar transformações.

    2. Na janela Testar transformação, selecione a função que você quer testar.

    3. Na janela Mensagem de entrada, insira uma mensagem de amostra.

    4. Para adicionar um atributo à mensagem, clique em Adicionar um atributo e insira a chave e o valor do atributo. É possível adicionar vários atributos.

    5. Clique em Teste. O resultado da aplicação da SMT na mensagem é exibido em Mensagem de saída.

    6. Para fechar a janela Testar transformações, clique em Fechar.

    Se você criar mais de uma SMT, poderá testar toda a sequência de transformações da seguinte maneira:

    1. Teste a primeira SMT na sequência, conforme descrito nas etapas anteriores.
    2. Selecione a próxima SMT. A mensagem de entrada é preenchida previamente com a mensagem de saída do teste anterior.
    3. Continue testando as SMTs em ordem para garantir que toda a sequência funcione conforme o esperado.
  10. Para criar o tópico, clique em Criar.

gcloud

  1. No Google Cloud console, ative o Cloud Shell.

    Ativar o Cloud Shell

    Na parte de baixo do Google Cloud console, uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. O Cloud Shell é um ambiente shell com a Google Cloud CLI já instalada e com valores já definidos para o projeto atual. A inicialização da sessão pode levar alguns segundos.

  2. Crie um arquivo YAML ou JSON que defina uma ou mais SMTs. A definição YAML ou JSON depende do tipo de SMT. Para mais informações, consulte Tipos de SMTs.

    Se o arquivo incluir mais de uma SMT, o Pub/Sub as executará na ordem listada.

  3. Opcional. Para validar uma SMT, execute o gcloud pubsub message-transforms validate comando:

    gcloud pubsub message-transforms validate \
      --message-transform-file=TRANSFORM_FILE
    

    Substitua:

    • TRANSFORM_FILE: o caminho para um arquivo YAML ou JSON que define uma única SMT. Se você estiver criando várias SMTs, valide-as individualmente.
  4. Opcional. Para testar uma ou mais SMTs em uma mensagem de amostra do Pub/Sub execute o gcloud pubsub message-transforms test comando:

    gcloud pubsub message-transforms test \
      --message-transforms-file=TRANSFORMS_FILE \
      --message=MESSAGE \
      --attribute=ATTRIBUTES
    

    Substitua:

    • TRANSFORMS_FILE: o caminho para um arquivo YAML ou JSON que define uma ou mais SMTs.
    • MESSAGE: o corpo da mensagem de amostra.
    • ATTRIBUTES: opcional. Uma lista separada por vírgulas de atributos de mensagem. Cada atributo é um par de chave-valor formatado como KEY="VALUE".

    O comando executa as SMTs em ordem, usando a saída de cada SMT como entrada para a próxima. O comando gera os resultados de cada etapa.

  5. Para criar o tópico, execute o gcloud pubsub topics create comando:

    gcloud pubsub topics create TOPIC_ID \
      --message-transforms-file=TRANSFORMS_FILE
    

    Substitua:

    • TOPIC_ID: o ID ou nome do tópico que você quer criar. Para diretrizes sobre como nomear um tópico, consulte Nomes de recursos. O nome de um tópico é imutável.
    • TRANSFORMS_FILE: o caminho para um arquivo YAML ou JSON que define uma ou mais SMTs.

Java

Antes de tentar essa amostra, siga as instruções de configuração do Java em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Java.


import com.google.api.gax.rpc.AlreadyExistsException;
import com.google.cloud.pubsub.v1.TopicAdminClient;
import com.google.pubsub.v1.JavaScriptUDF;
import com.google.pubsub.v1.MessageTransform;
import com.google.pubsub.v1.Topic;
import com.google.pubsub.v1.TopicName;
import java.io.IOException;

public class CreateTopicWithSmtExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String topicId = "your-topic-id";

    createTopicWithSmtExample(projectId, topicId);
  }

  public static void createTopicWithSmtExample(String projectId, String topicId)
      throws IOException {
    TopicName topicName = TopicName.of(projectId, topicId);

    // UDF that removes the 'ssn' field, if present
    String code =
        "function redactSSN(message, metadata) {"
            + "  const data = JSON.parse(message.data);"
            + "  delete data['ssn'];"
            + "  message.data = JSON.stringify(data);"
            + "  return message;"
            + "}";
    String functionName = "redactSSN";

    JavaScriptUDF udf =
        JavaScriptUDF.newBuilder().setCode(code).setFunctionName(functionName).build();
    MessageTransform transform = MessageTransform.newBuilder().setJavascriptUdf(udf).build();
    try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {

      Topic topic =
          topicAdminClient.createTopic(
              Topic.newBuilder()
                  .setName(topicName.toString())
                  // Add the UDF message transform
                  .addMessageTransforms(transform)
                  .build());

      System.out.println("Created topic with SMT: " + topic.getName());
    } catch (AlreadyExistsException e) {
      System.out.println(topicName + "already exists.");
    }
  }
}

Python

Antes de tentar esse exemplo, siga as instruções de configuração do Python em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Python do Pub/Sub.

from google.cloud import pubsub_v1
from google.pubsub_v1.types import JavaScriptUDF, MessageTransform, Topic

# TODO(developer)
# project_id = "your-project-id"
# topic_id = "your-topic-id"

code = """function redactSSN(message, metadata) {
            const data = JSON.parse(message.data);
            delete data['ssn'];
            message.data = JSON.stringify(data);
            return message;
            }"""
udf = JavaScriptUDF(code=code, function_name="redactSSN")
transforms = [MessageTransform(javascript_udf=udf)]

publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(project_id, topic_id)

request = Topic(name=topic_path, message_transforms=transforms)

topic = publisher.create_topic(request=request)

print(f"Created topic: {topic.name} with SMT")

Go

O exemplo a seguir usa a versão principal da biblioteca de cliente do Go Pub/Sub (v2). Se você ainda estiver usando a biblioteca v1, consulte o guia de migração para a v2. Para conferir uma lista de exemplos de código da v1, consulte os exemplos de código obsoletos.

Antes de tentar esse exemplo, siga as instruções de configuração do Go em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Go.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsub/v2"
	"cloud.google.com/go/pubsub/v2/apiv1/pubsubpb"
)

// createTopicWithSMT creates a topic with a single message transform function applied.
func createTopicWithSMT(w io.Writer, projectID, topicID string) error {
	// projectID := "my-project-id"
	// topicID := "my-topic"
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %w", err)
	}
	defer client.Close()

	code := `function redactSSN(message, metadata) {
			const data = JSON.parse(message.data);
			delete data['ssn'];
			message.data = JSON.stringify(data);
			return message;
		}`
	transform := &pubsubpb.MessageTransform{
		Transform: &pubsubpb.MessageTransform_JavascriptUdf{
			JavascriptUdf: &pubsubpb.JavaScriptUDF{
				FunctionName: "redactSSN",
				Code:         code,
			},
		},
	}

	topic := &pubsubpb.Topic{
		Name:              fmt.Sprintf("projects/%s/topics/%s", projectID, topicID),
		MessageTransforms: []*pubsubpb.MessageTransform{transform},
	}

	topic, err = client.TopicAdminClient.CreateTopic(ctx, topic)
	if err != nil {
		return fmt.Errorf("CreateTopic: %w", err)
	}

	fmt.Fprintf(w, "Created topic with message transform: %v\n", topic)
	return nil
}

A seguir