Thema mit SMTs erstellen

In diesem Dokument wird erläutert, wie Sie ein Pub/Sub-Thema mit Single Message Transforms (SMTs) erstellen.

Mit SMTs für Themen können Sie direkt in Pub/Sub einfache Änderungen an Nachrichtendaten und -attributen vornehmen. Mit dieser Funktion können Sie Daten bereinigen, filtern oder das Format konvertieren, bevor die Nachrichten im Thema veröffentlicht werden.

Sie können ein Thema mit SMTs über die Google Cloud Console, die Google Cloud CLI, die Clientbibliothek oder die Pub/Sub API erstellen.

Hinweis

Erforderliche Rollen und Berechtigungen

Bitten Sie Ihren Administrator, Ihnen die Pub/Sub-Bearbeiter (roles/pubsub.editor) IAM-Rolle für Ihr Projekt zuzuweisen, um die Berechtigung zum Erstellen eines Themas mit SMTs zu erhalten. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Diese vordefinierte Rolle enthält die pubsub.topics.create Berechtigung, die zum Erstellen eines Themas mit SMTs erforderlich ist.

Sie können diese Berechtigung auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.

Thema mit SMTs erstellen

Bevor Sie ein Thema mit SMTs erstellen, lesen Sie die Dokumentation zu den Eigenschaften eines Themas.

Führen Sie die folgenden Schritte aus, um ein Pub/Sub-Thema mit einem oder mehreren SMTs zu erstellen. Sie können bis zu fünf SMTs pro Thema aktivieren.

Console

  1. Öffnen Sie in der Google Cloud Console die Pub/Sub-Themen Seite.

    Themen aufrufen

  2. Klicken Sie auf Thema erstellen.

  3. Geben Sie im Feld Themen-ID eine ID für das Thema ein. Weitere Informationen zum Benennen von Themen finden Sie in den Benennungsrichtlinien.

  4. Klicken Sie unter Transformationen auf Transformation hinzufügen.

  5. Wählen Sie den Transformationstyp aus. Weitere Informationen zu den unterstützten SMT Typen finden Sie unter SMT-Typen.

  6. Legen Sie die Konfigurationseigenschaften für das SMT fest. Die Eigenschaften hängen vom Typ des SMT ab. Weitere Informationen finden Sie in der Dokumentation für den jeweiligen SMT-Typ.

  7. Optional. Klicken Sie auf Validieren, um das SMT zu validieren. Wenn das SMT gültig ist, wird die Meldung "Validation passed" angezeigt. Andernfalls wird eine Fehlermeldung angezeigt.

  8. Wenn Sie eine weitere Transformation hinzufügen möchten, klicken Sie auf Transformation hinzufügen und wiederholen Sie die vorherigen Schritte.

    Wenn Sie die SMTs in einer bestimmten Reihenfolge anordnen möchten, klicken Sie auf Nach oben verschieben oder Nach unten verschieben. Wenn Sie ein SMT entfernen möchten, klicken Sie auf Löschen.

  9. Optional. So testen Sie ein SMT mit einer Beispielnachricht:

    1. Klicken Sie auf Transformationen testen.

    2. Wählen Sie im Fenster Transformation testen die Funktion aus, die Sie testen möchten.

    3. Geben Sie im Fenster Eingabenachricht eine Beispielnachricht ein.

    4. Wenn Sie der Nachricht ein Attribut hinzufügen möchten, klicken Sie auf Attribut hinzufügen und geben Sie den Schlüssel und den Wert des Attributs ein. Sie können mehrere Attribute hinzufügen.

    5. Klicken Sie auf Test. Das Ergebnis der Anwendung des SMT auf die Nachricht wird unter Ausgabenachricht angezeigt.

    6. Klicken Sie auf Schließen, um das Fenster Transformationen testen zu schließen.

    Wenn Sie mehrere SMTs erstellen, können Sie die gesamte Abfolge von Transformationen so testen:

    1. Testen Sie das erste SMT in der Abfolge wie in den vorherigen Schritten beschrieben.
    2. Wählen Sie das nächste SMT aus. Die Eingabenachricht wird automatisch mit der Ausgabenachricht aus dem vorherigen Test gefüllt.
    3. Testen Sie die SMTs der Reihe nach, um sicherzustellen, dass die gesamte Abfolge wie erwartet funktioniert.
  10. Klicken Sie auf Erstellen, um das Thema zu erstellen.

gcloud

  1. Aktivieren Sie Cloud Shell in der Google Cloud Console.

    Cloud Shell aktivieren

    Unten in der Google Cloud Console wird eine Cloud Shell Sitzung gestartet und eine Befehlszeilenaufforderung angezeigt. Cloud Shell ist eine Shell-Umgebung in der das Google Cloud CLI bereits installiert ist und Werte für Ihr aktuelles Projekt bereits festgelegt sind. Das Initialisieren der Sitzung kann einige Sekunden dauern.

  2. Erstellen Sie eine YAML- oder JSON-Datei, die ein oder mehrere SMTs definiert. Die YAML- oder JSON-Definition hängt vom Typ des SMT ab. Weitere Informationen finden Sie unter SMT-Typen.

    Wenn die Datei mehrere SMTs enthält, werden sie von Pub/Sub in der aufgeführten Reihenfolge ausgeführt.

  3. Optional. Führen Sie den gcloud pubsub message-transforms validate Befehl aus, um ein SMT zu validieren:

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

    Ersetzen Sie Folgendes:

    • TRANSFORM_FILE: Der Pfad zu einer YAML- oder JSON-Datei die ein einzelnes SMT definiert. Wenn Sie mehrere SMTs erstellen, müssen Sie sie einzeln validieren.
  4. Optional. Führen Sie den gcloud pubsub message-transforms test Befehl aus, um ein oder mehrere SMTs mit einer Pub/Sub Beispielnachricht zu testen:

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

    Ersetzen Sie Folgendes:

    • TRANSFORMS_FILE: Der Pfad zu einer YAML- oder JSON-Datei die ein oder mehrere SMTs definiert.
    • MESSAGE: Der Text der Beispielnachricht.
    • ATTRIBUTES: Optional. Eine durch Kommas getrennte Liste von Nachrichtenattributen. Jedes Attribut ist ein Schlüssel/Wert-Paar im Format KEY="VALUE".

    Der Befehl führt die SMTs der Reihe nach aus und verwendet die Ausgabe jedes SMT als Eingabe für das nächste. Der Befehl gibt die Ergebnisse jedes Schritts aus.

  5. Führen Sie den gcloud pubsub topics create Befehl aus, um das Thema zu erstellen:

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

    Ersetzen Sie Folgendes:

    • TOPIC_ID: Die ID oder der Name des Themas, das Sie erstellen möchten. Richtlinien zum Benennen eines Themas finden Sie unter Ressourcennamen. Der Name eines Themas kann nicht geändert werden.
    • TRANSFORMS_FILE: Der Pfad zu einer YAML- oder JSON-Datei die ein oder mehrere SMTs definiert.

C#

Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für C# in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub C# API.


using Google.Cloud.PubSub.V1;
using System;

public class CreateTopicWithSingleMessageTransformSample
{
    public Topic CreateTopicWithSingleMessageTransform(string projectId, string topicId)
    {
        PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
        var topicName = TopicName.FromProjectTopic(projectId, topicId);

        MessageTransform removeSSNTransform = new MessageTransform
        {
            JavascriptUdf = new JavaScriptUDF
            {
                FunctionName = "redactSsn",
                Code = "function redactSsn(message, metadata) {"
                + "   const data = JSON.parse(message.data);"
                + "   delete data['ssn'];"
                + "   message.data = JSON.stringify(data);"
                + "   return message;"
                + "}"
            },
        };

        Topic topic = publisher.CreateTopic(new Topic()
        {
            TopicName = topicName,
            MessageTransforms = { removeSSNTransform }
        });
        Console.WriteLine($"Topic {topic.Name} created with SMT.");

        return topic;
    }
}

Java

Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für Java in der Kurzanleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Java API.


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

Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für Python in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Python API.

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

Im folgenden Beispiel wird die Hauptversion der Go Pub/Sub-Clientbibliothek (Version 2) verwendet. Wenn Sie noch die Version 1 verwenden, lesen Sie den Migrationsleitfaden zu Version 2. Eine Liste der Codebeispiele für Version 1 finden Sie unter Veraltete Codebeispiele.

Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für Go in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Go API.

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
}

Nächste Schritte