Creare un argomento con SMT

Questo documento spiega come creare un argomento Pub/Sub con Single Message Transforms (SMT).

Le SMT degli argomenti consentono modifiche leggere ai dati e agli attributi dei messaggi direttamente in Pub/Sub. Questa funzionalità consente la pulizia, il filtraggio o la conversione del formato dei dati prima che i messaggi vengano pubblicati nell'argomento.

Per creare un argomento con SMT, puoi utilizzare la Google Cloud console, Google Cloud CLI, la libreria client o l'API Pub/Sub.

Prima di iniziare

Ruoli e autorizzazioni richiesti

Per ottenere le autorizzazioni necessarie per creare un argomento con SMT, chiedi all'amministratore di concederti il ruolo IAM Pub/Sub Editor (roles/pubsub.editor) nel tuo progetto. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Questo ruolo predefinito contiene le autorizzazioni necessarie per creare un argomento con SMT. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:

Autorizzazioni obbligatorie

Per creare un argomento con SMT sono necessarie le seguenti autorizzazioni:

  • Concedi l'autorizzazione per creare un argomento sul progetto: pubsub.topics.create

Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.

Puoi configurare il controllo dell'accesso a livello di progetto e a livello di singola risorsa.

Crea un argomento con SMT

Prima di creare un argomento con SMT, consulta la documentazione relativa alle proprietà di un argomento.

I seguenti esempi presuppongono che tu voglia creare un argomento con questa trasformazione strutturata (SMT) della funzione definita dall'utente. Per saperne di più sulle UDF, consulta la panoramica delle UDF.

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

Console

  1. Nella console Google Cloud , vai alla pagina Argomenti di Pub/Sub.

    Vai ad Argomenti

  2. Fai clic su Crea argomento.

    Viene visualizzata la pagina Crea argomento.

  3. Nel campo ID argomento, inserisci un ID per l'argomento. Per ulteriori informazioni sulla denominazione degli argomenti, consulta le linee guida per la denominazione.

  4. In Trasformazioni, fai clic su Aggiungi una trasformazione.

  5. Inserisci un nome di funzione. Ad esempio: redactSSN.

  6. Se non vuoi utilizzare la SMT con l'argomento immediatamente, fai clic sull'opzione Disattiva trasformazione. In questo modo la SMT verrà comunque salvata, ma non verrà eseguita man mano che i messaggi scorrono nell'argomento.

  7. Inserisci una nuova trasformazione. Ad esempio:

    function redactSSN(message, metadata) {
      const data = JSON.parse(message.data);
      delete data['ssn'];
      message.data = JSON.stringify(data);
      return message;
    }
  8. Pub/Sub fornisce una funzione di convalida che consente di convalidare un SMT. Fai clic su Convalida per convalidare la trasformazione.

  9. Se vuoi aggiungere un'altra trasformazione, fai clic su Aggiungi una trasformazione.

  10. Per disporre tutti gli SMT in un ordine specifico, puoi utilizzare le frecce su e giù. Per rimuovere un SMT, fai clic sul pulsante di eliminazione.
  11. Pub/Sub fornisce una funzione di test che consente di controllare il risultato dell'esecuzione di SMT su un messaggio di esempio. Per testare le SMT, fai clic su Testa trasformazione.

  12. Nella finestra Testa trasformazione, seleziona la funzione che vuoi testare.

  13. Nella finestra Messaggio di input, inserisci un messaggio di esempio.

  14. Se vuoi aggiungere attributi del messaggio, fai clic su Aggiungi un attributo e inserisci una o più coppie chiave-valore.

  15. Fai clic su Test. Viene visualizzato il risultato dell'applicazione delle SMT al messaggio.

  16. Chiudi la finestra per interrompere il test delle SMT sui messaggi di esempio.

  17. Fai clic su Crea per creare l'argomento.

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 fornisce una funzione di convalida che consente di convalidare un SMT. Esegui il comando gcloud pubsub message-transforms validate:

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

    Sostituisci quanto segue:

    • TRANSFORM_FILE: il percorso del file YAML o JSON contenente un singolo SMT.

      Ecco un esempio di file di trasformazione 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 fornisce una funzione di test che consente di controllare il risultato dell'esecuzione di una o più SMT su un messaggio di esempio. Esegui il comando gcloud pubsub message-transforms test:

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

    Sostituisci quanto segue:

    • TRANSFORMS_FILE: il percorso del file YAML o JSON contenente uno o più SMT.

      Ecco un esempio di file di trasformazioni 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: corpo del messaggio con cui testare gli SMT.

    • ATTRIBUTES: Attributi del messaggio con cui testare gli SMT.

  4. Per creare l'argomento, esegui il comando gcloud pubsub topics create:

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

    Sostituisci quanto segue:

    • TOPIC_ID: l'ID o il nome dell'argomento che vuoi creare. Per le linee guida su come denominare un argomento, consulta Nomi delle risorse. Il nome di un argomento è immutabile.

    • TRANSFORMS_FILE: Il percorso del file YAML o JSON contenente uno o più SMT.

      Ecco un esempio di file di trasformazioni 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

Prima di provare questo esempio, segui le istruzioni di configurazione di Java nella guida rapida di Pub/Sub per l'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub Java.

Per eseguire l'autenticazione in Pub/Sub, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.


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

Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida di Pub/Sub per l'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub Python.

Per eseguire l'autenticazione in Pub/Sub, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

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

Prima di provare questo esempio, segui le istruzioni di configurazione di Go nella guida rapida di Pub/Sub per l'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub Go.

Per eseguire l'autenticazione in Pub/Sub, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

// 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
}

Passaggi successivi