Créer un sujet avec des SMT

Ce document explique comment créer un sujet Pub/Sub avec des transformations de message unique (SMT).

Les SMT de sujet permettent de modifier légèrement les données et les attributs des messages directement dans Pub/Sub. Cette fonctionnalité permet de nettoyer, de filtrer ou de convertir le format des données avant que les messages ne soient publiés dans le sujet.

Pour créer un sujet avec des SMT, vous pouvez utiliser la Cloud de Confiance console, la Google Cloud CLI, la bibliothèque cliente ou l'API Pub/Sub.

Avant de commencer

Rôles et autorisations requis

Pour obtenir l'autorisation nécessaire pour créer un sujet avec des SMT, demandez à votre administrateur de vous accorder le rôle IAM Éditeur Pub/Sub (roles/pubsub.editor) sur votre projet. Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Ce rôle prédéfini contient l' pubsub.topics.create autorisation, qui est nécessaire pour créer un sujet avec des SMT.

Vous pouvez également obtenir cette autorisation avec des rôles personnalisés ou d'autres rôles prédéfinis.

Créer un sujet avec des SMT

Avant de créer un sujet avec des SMT, consultez la documentation sur les propriétés d'un sujet.

Pour créer un sujet Pub/Sub avec une ou plusieurs SMT, procédez comme suit. Vous pouvez activer jusqu'à cinq SMT par sujet.

Console

  1. Dans la Cloud de Confiance console, accédez à la page Sujets de Pub/Sub.

    Accéder aux sujets

  2. Cliquez sur Create topic (Créer un sujet).

  3. Dans le champ Topic ID (ID du sujet), saisissez un ID pour votre sujet. Pour en savoir plus sur la dénomination des sujets, consultez les consignes de dénomination.

  4. Sous Transforms (Transformations), cliquez sur Add a transform (Ajouter une transformation).

  5. Sélectionnez le Transform type (Type de transformation). Pour en savoir plus sur les types de SMT compatibles, consultez Types de SMT.

  6. Définissez les propriétés de configuration de la SMT. L'ensemble de propriétés dépend du type de SMT. Pour en savoir plus, consultez la documentation de ce type de SMT.

  7. Facultatif. Pour valider la SMT, cliquez sur Validate (Valider). Si la SMT est valide, le message "Validation passed" s'affiche. Sinon, un message d'erreur s'affiche.

  8. Pour ajouter une autre transformation, cliquez sur Add a transform (Ajouter une transformation), puis répétez les étapes précédentes.

    Pour organiser les SMT dans un ordre spécifique, cliquez sur Déplacer vers le haut ou Déplacer vers le bas. Pour supprimer une SMT, cliquez sur Supprimer.

  9. Facultatif. Pour tester une SMT sur un exemple de message, procédez comme suit :

    1. Cliquez sur Test transforms (Tester les transformations).

    2. Dans la fenêtre Test transform (Tester la transformation), sélectionnez la fonction que vous souhaitez tester.

    3. Dans la fenêtre Input message (Message d'entrée), saisissez un exemple de message.

    4. Pour ajouter un attribut au message, cliquez sur Add an attribute (Ajouter un attribut), puis saisissez la clé et la valeur de l'attribut. Vous pouvez ajouter plusieurs attributs.

    5. Cliquez sur Test. Le résultat de l'application de la SMT au message s'affiche sous Output message (Message de sortie).

    6. Pour fermer la fenêtre Test transforms (Tester les transformations), cliquez sur Close.

    Si vous créez plusieurs SMT, vous pouvez tester l'ensemble de la séquence de transformations comme suit :

    1. Testez la première SMT de la séquence, comme décrit dans les étapes précédentes.
    2. Sélectionnez la SMT suivante. Le message d'entrée est prérempli avec le message de sortie du test précédent.
    3. Continuez à tester les SMT dans l'ordre pour vous assurer que l'ensemble de la séquence fonctionne comme prévu.
  10. Pour créer le sujet, cliquez sur Create (Créer).

gcloud

  1. Dans la Cloud de Confiance console, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la Cloud de Confiance console, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement de shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

  2. Créez un fichier YAML ou JSON qui définit une ou plusieurs SMT. La définition YAML ou JSON dépend du type de SMT. Pour en savoir plus, consultez Types de SMT.

    Si le fichier inclut plusieurs SMT, Pub/Sub les exécute dans l'ordre indiqué.

  3. Facultatif. Pour valider une SMT, exécutez la gcloud pubsub message-transforms validate commande :

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

    Remplacez les éléments suivants :

    • TRANSFORM_FILE : chemin d'accès à un fichier YAML ou JSON qui définit une seule SMT. Si vous créez plusieurs SMT, vous devez les valider individuellement.
  4. Facultatif. Pour tester une ou plusieurs SMT sur un exemple de message Pub/Sub message, exécutez la gcloud pubsub message-transforms test commande :

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

    Remplacez les éléments suivants :

    • TRANSFORMS_FILE : chemin d'accès à un fichier YAML ou JSON qui définit une ou plusieurs SMT.
    • MESSAGE : corps de l'exemple de message.
    • ATTRIBUTES : facultatif. Liste d'attributs de message séparés par une virgule. Chaque attribut est une paire clé/valeur au format KEY="VALUE".

    La commande exécute les SMT dans l'ordre, en utilisant la sortie de chaque SMT comme entrée pour la suivante. La commande génère les résultats de chaque étape.

  5. Pour créer le sujet, exécutez la gcloud pubsub topics create commande :

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

    Remplacez les éléments suivants :

    • TOPIC_ID : ID ou nom du sujet que vous souhaitez créer. Pour obtenir des consignes sur la dénomination d'un sujet, consultez Noms de ressources. Le nom d'un sujet est immuable.
    • TRANSFORMS_FILE : chemin d'accès à un fichier YAML ou JSON qui définit une ou plusieurs SMT.

Java

Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Java qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub pour 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

Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Python qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub pour 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

L'exemple suivant utilise la version majeure de la bibliothèque cliente Go Pub/Sub (v2). Si vous utilisez toujours la bibliothèque v1, consultez le guide de migration vers la v2. Pour afficher la liste des exemples de code v1, consultez Exemples de code obsolètes.

Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Go qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub pour 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
}

Étape suivante