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 facilement 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 la publication des messages dans le sujet.

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

Avant de commencer

Rôles et autorisations requis

Pour obtenir les autorisations nécessaires 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 la page Gérer l'accès aux projets, aux dossiers et aux organisations.

Ce rôle prédéfini contient les autorisations requises pour créer un thème avec des SMT. Pour connaître les autorisations exactes requises, développez la section Autorisations requises :

Autorisations requises

Les autorisations suivantes sont requises pour créer un sujet avec des SMT :

  • Accordez l'autorisation de créer un sujet sur le projet : pubsub.topics.create

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

Vous pouvez configurer le contrôle des accès au niveau du projet et au niveau de chaque ressource.

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.

Les exemples suivants supposent que vous souhaitez créer un sujet avec cette fonction définie par l'utilisateur (UDF) SMT. Pour en savoir plus sur les fonctions définies par l'utilisateur, consultez la présentation des fonctions définies par l'utilisateur.

function redactSSN(message, metadata) {
  const data = JSON.parse(message.data);
  delete data['ssn'];
  message.data = JSON.stringify(data);
  return message;
}

Console

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

    Accéder aux sujets

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

    La page Créer un sujet s'ouvre.

  3. Dans le champ ID du sujet, saisissez un ID pour votre sujet. Pour en savoir plus sur l'attribution de noms aux thèmes, consultez les consignes de dénomination.

  4. Sous Transformations, cliquez sur Ajouter une transformation.

  5. Saisissez un nom de fonction. Exemple : redactSSN.

  6. Si vous ne souhaitez pas utiliser immédiatement le SMT avec votre thème, cliquez sur l'option Désactiver la transformation. La SMT sera toujours enregistrée, mais elle ne sera pas exécutée lorsque des messages transiteront par votre thème.

  7. Saisissez une nouvelle transformation. Exemple :

    function redactSSN(message, metadata) {
      const data = JSON.parse(message.data);
      delete data['ssn'];
      message.data = JSON.stringify(data);
      return message;
    }
  8. Pub/Sub fournit une fonction de validation qui vous permet de valider une transformation de message unique. Cliquez sur Valider pour valider la transformation.

  9. Si vous souhaitez ajouter une autre transformation, cliquez sur Ajouter une transformation.

  10. Pour organiser tous les SMT dans un ordre spécifique, vous pouvez utiliser les flèches vers le haut et vers le bas. Pour supprimer un SMT, cliquez sur le bouton Supprimer.
  11. Pub/Sub fournit une fonction de test qui vous permet de vérifier le résultat de l'exécution du SMT sur un exemple de message. Pour tester les SMT, cliquez sur Tester la transformation.

  12. Dans la fenêtre Tester la transformation, sélectionnez la fonction que vous souhaitez tester.

  13. Dans la fenêtre Message d'entrée, saisissez un exemple de message.

  14. Si vous souhaitez ajouter des attributs de message, cliquez sur Ajouter un attribut, puis saisissez une ou plusieurs paires clé/valeur.

  15. Cliquez sur Test. Le résultat de l'application des SMT au message s'affiche.

  16. Fermez la fenêtre pour arrêter de tester les SMT sur des exemples de messages.

  17. Cliquez sur Créer pour créer le sujet.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Pub/Sub fournit une fonction de validation qui vous permet de valider un SMT. Exécutez la commande gcloud pubsub message-transforms validate :

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

    Remplacez les éléments suivants :

    • TRANSFORM_FILE : chemin d'accès au fichier YAML ou JSON contenant un seul SMT.

      Voici un exemple de fichier de transformation YAML :

      - javascriptUdf:
          code: >
              function redactSSN(message, metadata) {
                const data = JSON.parse(message.data);
                delete data['ssn'];
                message.data = JSON.stringify(data);
                return message;
              }
          functionName: redactSSN

  3. Pub/Sub fournit une fonction de test qui vous permet de vérifier le résultat de l'exécution d'un ou de plusieurs SMT sur un exemple de message. Exécutez la commande gcloud pubsub message-transforms test :

    gcloud pubsub message-transforms test --message-transforms-file=TRANSFORMS_FILE --message=MESSAGE --attributes=ATTRIBUTES

    Remplacez les éléments suivants :

    • TRANSFORMS_FILE : chemin d'accès au fichier YAML ou JSON contenant un ou plusieurs SMT.

      Voici un exemple de fichier de transformations YAML :

      - javascriptUdf:
          code: >
              function redactSSN(message, metadata) {
                const data = JSON.parse(message.data);
                delete data['ssn'];
                message.data = JSON.stringify(data);
                return message;
              }
          functionName: redactSSN

    • MESSAGE : corps du message avec lequel tester les SMT.

    • ATTRIBUTES : attributs de message avec lesquels tester le ou les SMT.

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

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

    Remplacez l'élément suivant :

    • TOPIC_ID : ID ou nom de la rubrique que vous souhaitez créer. Pour obtenir des consignes sur la façon de nommer un sujet, consultez Noms de ressources. Le nom d'un thème est immuable.

    • TRANSFORMS_FILE : chemin d'accès au fichier YAML ou JSON contenant un ou plusieurs SMT.

      Voici un exemple de fichier de transformations YAML :

      - javascriptUdf:
          code: >
              function redactSSN(message, metadata) {
                const data = JSON.parse(message.data);
                delete data['ssn'];
                message.data = JSON.stringify(data);
                return message;
              }
          functionName: redactSSN

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de Pub/Sub : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Java.

Pour vous authentifier auprès de Pub/Sub, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.


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 de configuration pour Python du guide de démarrage rapide de Pub/Sub : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Python.

Pour vous authentifier auprès de Pub/Sub, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

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

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go du guide de démarrage rapide de Pub/Sub : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Go.

Pour vous authentifier auprès de Pub/Sub, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package topics

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsub"
)

// 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 := pubsub.MessageTransform{
		Transform: pubsub.JavaScriptUDF{
			FunctionName: "redactSSN",
			Code:         code,
		},
	}
	cfg := &pubsub.TopicConfig{
		MessageTransforms: []pubsub.MessageTransform{transform},
	}
	t, err := client.CreateTopicWithConfig(ctx, topicID, cfg)
	if err != nil {
		return fmt.Errorf("CreateTopic: %w", err)
	}

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

Étapes suivantes