Crea un tema con SMT

En este documento, se explica cómo crear un tema de Pub/Sub con transformaciones de mensajes únicos (SMT).

Las SMT de temas permiten realizar modificaciones ligeras en los datos y atributos de los mensajes directamente en Pub/Sub. Esta función permite limpiar, filtrar o convertir el formato de los datos antes de que se publiquen los mensajes en el tema.

Para crear un tema con SMT, puedes usar la Google Cloud consola de , Google Cloud CLI, la biblioteca cliente o la API de Pub/Sub.

Antes de comenzar

Roles y permisos requeridos

Para obtener los permisos que necesitas para crear un tema con SMT, pídele a tu administrador que te otorgue el rol de IAM Editor de Pub/Sub (roles/pubsub.editor) en tu proyecto. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para crear un tema con SMT. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para crear un tema con SMT:

  • Otorgar el permiso para crear un tema en el proyecto: pubsub.topics.create

También puedes obtener estos permisos con roles personalizados o otros roles predefinidos.

Puedes configurar el control de acceso a nivel de proyecto y a nivel de los recursos individuales.

Crea un tema con SMT

Antes de crear un tema con SMT, revisa la documentación para Propiedades de un tema.

Para crear un tema de Pub/Sub con una o más SMT, realiza los siguientes pasos. Puedes habilitar hasta 5 SMT por tema.

Console

  1. En la Google Cloud consola de, ve a la página Temas de Pub/Sub.

    Ir a temas

  2. Haga clic en Crear tema.

  3. En el campo ID de tema, ingresa un ID para tu tema. Para obtener más información sobre cómo nombrar temas, consulta los lineamientos para asignar nombres.

  4. En Transformaciones, haz clic en Agregar una transformación.

  5. Selecciona el Tipo de transformación. Para obtener más información sobre los tipos de SMT compatibles, consulta Tipos de SMT.

  6. Establece las propiedades de configuración para la SMT. El conjunto de propiedades depende del tipo de SMT. Para obtener más información, consulta la documentación de ese tipo de SMT.

  7. Es opcional. Para validar la SMT, haz clic en Validar. Si la SMT es válida, se muestra el mensaje "Validation passed". De lo contrario, se muestra un mensaje de error.

  8. Para agregar otra transformación, haz clic en Agregar una transformación y repite los pasos anteriores.

    Para organizar las SMT en un orden específico, haz clic en Subir o Bajar. Para quitar una SMT, haz clic en Borrar.

  9. Es opcional. Para probar una SMT en un mensaje de muestra, realiza los siguientes pasos:

    1. Haz clic en Probar transformaciones.

    2. En la ventana Probar transformación, selecciona la función que deseas probar.

    3. En la ventana Mensaje de entrada, ingresa un mensaje de muestra.

    4. Para agregar un atributo al mensaje, haz clic en Agregar un atributo y, luego, ingresa la clave y el valor del atributo. Puedes agregar varios atributos.

    5. Haz clic en Probar. El resultado de aplicar la SMT en el mensaje se muestra en Mensaje de salida.

    6. Para cerrar la ventana Probar transformaciones, haz clic en Cerrar.

    Si creas más de una SMT, puedes probar toda la secuencia de transformaciones de la siguiente manera:

    1. Prueba la primera SMT de la secuencia, como se describe en los pasos anteriores.
    2. Selecciona la siguiente SMT. El mensaje de entrada se completa previamente con el mensaje de salida de la prueba anterior.
    3. Continúa probando las SMT en orden para asegurarte de que toda la secuencia funcione como se espera.
  10. Para crear el tema, haz clic en Crear.

gcloud

  1. En la Google Cloud consola de, activa Cloud Shell.

    Activa Cloud Shell

    En la parte inferior de la Google Cloud consola de, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell con Google Cloud CLI ya instalada y con valores ya establecidos para el proyecto actual. La sesión puede tardar unos segundos en inicializarse.

  2. Crea un archivo YAML o JSON que defina una o más SMT. La definición de YAML o JSON depende del tipo de SMT. Para obtener más información, consulta Tipos de SMT.

    Si el archivo incluye más de una SMT, Pub/Sub las ejecuta en el orden que se indica.

  3. Es opcional. Para validar una SMT, ejecuta el gcloud pubsub message-transforms validate comando:

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

    Reemplaza lo siguiente:

    • TRANSFORM_FILE: Es la ruta de acceso a un archivo YAML o JSON que define una sola SMT. Si creas varias SMT, debes validarlas de forma individual.
  4. Es opcional. Para probar una o más SMT en un mensaje de Pub/Sub de muestra, ejecuta el gcloud pubsub message-transforms test comando:

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

    Reemplaza lo siguiente:

    • TRANSFORMS_FILE: Es la ruta de acceso a un archivo YAML o JSON que define una o más SMT.
    • MESSAGE: Es el cuerpo del mensaje de muestra.
    • ATTRIBUTES: Es opcional. Es una lista separada por comas de los atributos del mensaje. Cada atributo es un par clave-valor con el formato KEY="VALUE".

    El comando ejecuta las SMT en orden y usa el resultado de cada SMT como entrada para la siguiente. El comando genera los resultados de cada paso.

  5. Para crear el tema, ejecuta el gcloud pubsub topics create comando:

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

    Reemplaza lo siguiente:

    • TOPIC_ID: Es el ID o el nombre del tema que deseas crear. Para obtener instrucciones sobre cómo nombrar un tema, consulta Nombres de recursos. El nombre de un tema es inmutable.
    • TRANSFORMS_FILE: Es la ruta de acceso a un archivo YAML o JSON que define una o más SMT.

Java

Antes de probar esta muestra, sigue las instrucciones de configuración de Java en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para 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 probar esta muestra, sigue las instrucciones de configuración de Python en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Python .

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

En el siguiente ejemplo, se usa la versión principal de la biblioteca cliente de Pub/Sub para Go (v2). Si aún usas la biblioteca v1, consulta la guía de migración a la v2. Para ver una lista de ejemplos de código de la v1, consulta los ejemplos de código obsoletos.

Antes de probar esta muestra, sigue las instrucciones de configuración de Go en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para 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
}

¿Qué sigue?