Abo mit SMTs erstellen

In diesem Dokument wird beschrieben, wie Sie ein Pub/Sub-Abo mit Single Message Transforms (SMTs) erstellen.

Mit Abo-SMTs können Sie Nachrichtendaten und ‑attribute direkt in Pub/Sub auf einfache Weise ändern. Mit dieser Funktion können Daten bereinigt, gefiltert oder in ein anderes Format konvertiert werden, bevor die Nachrichten an einen Abonnentenclient gesendet werden.

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

Hinweise

Erforderliche Rollen und Berechtigungen

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

Diese vordefinierte Rolle enthält die Berechtigungen, die zum Erstellen eines Abos mit SMTs erforderlich sind. Erweitern Sie den Abschnitt Erforderliche Berechtigungen, um die erforderlichen Berechtigungen anzuzeigen:

Erforderliche Berechtigungen

Die folgenden Berechtigungen sind erforderlich, um ein Abo mit SMTs zu erstellen:

  • Erteilen Sie die Berechtigung zum Erstellen eines Abos für das Projekt: pubsub.subscriptions.create

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

Je nach Abo sind möglicherweise zusätzliche Berechtigungen erforderlich. Die genaue Liste der Berechtigungen finden Sie in dem Dokument, in dem die Erstellung des jeweiligen Abos beschrieben wird. Wenn Sie beispielsweise ein BigQuery-Abo mit SMTs erstellen, lesen Sie den Artikel BigQuery-Abos erstellen.

Wenn Sie ein Abo in einem anderen Projekt als dem Thema erstellen, müssen Sie dem Prinzipal des Projekts, das das Abo enthält, die Rolle roles/pubsub.subscriber im Projekt zuweisen, das das Thema enthält.

Sie können die Zugriffssteuerung auf Projektebene und auf der Ebene einzelner Ressourcen konfigurieren.

Abo mit SMTs erstellen

Bevor Sie ein Abo mit SMTs erstellen, sollten Sie sich die Dokumentation zu Eigenschaften eines Abos ansehen.

In den folgenden Beispielen wird davon ausgegangen, dass Sie ein Abo mit dieser benutzerdefinierten SMT-Funktion erstellen möchten. Weitere Informationen zu UDFs finden Sie in der Übersicht zu UDFs.

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

Console

  1. Rufen Sie in der Google Cloud Console die Pub/Sub-Seite Abos auf.

    Zu den Abos

  2. Klicken Sie auf Abo erstellen.

    Die Seite Abo erstellen wird geöffnet.

  3. Geben Sie im Feld Abo-ID eine ID für Ihr Abo ein. Weitere Informationen zur Benennung von Abos finden Sie in den Benennungsrichtlinien.

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

  5. Geben Sie einen Funktionsnamen ein. Beispiel: redactSSN.

  6. Wenn Sie die SMT nicht sofort mit Ihrem Abo verwenden möchten, klicken Sie auf die Option Transformation deaktivieren. Die SMT wird weiterhin gespeichert, aber nicht ausgeführt, wenn Nachrichten über Ihr Abo gesendet werden.

  7. Geben Sie eine neue Transformation ein. Beispiel:

    function redactSSN(message, metadata) {
      const data = JSON.parse(message.data);
      delete data['ssn'];
      message.data = JSON.stringify(data);
      return message;
    }
  8. Pub/Sub bietet eine Validierungsfunktion, mit der Sie eine SMT validieren können. Klicken Sie auf Validieren, um die Transformation zu validieren.

  9. Wenn Sie eine weitere Transformation hinzufügen möchten, klicken Sie auf Transformation hinzufügen.

  10. Mit den Auf- und Abwärtspfeilen können Sie alle SMTs in einer bestimmten Reihenfolge anordnen. Wenn Sie ein SMT entfernen möchten, klicken Sie auf die Schaltfläche „Löschen“.
  11. Pub/Sub bietet eine Testfunktion, mit der Sie das Ergebnis der Ausführung des SMT für eine Beispielnachricht prüfen können. Wenn Sie die SMTs testen möchten, klicken Sie auf Transformation testen.

  12. Wählen Sie im Fenster Testtransformierung die Funktion aus, die Sie testen möchten.

  13. Geben Sie im Fenster Eingabenachricht eine Beispielnachricht ein.

  14. Wenn Sie Nachrichtenattribute hinzufügen möchten, klicken Sie auf Attribut hinzufügen und geben Sie ein oder mehrere Schlüssel/Wert-Paare ein.

  15. Klicken Sie auf Testen. Das Ergebnis der Anwendung der SMTs auf die Nachricht wird angezeigt.

  16. Schließen Sie das Fenster, um das Testen von SMTs für Beispielnachrichten zu beenden.

  17. Klicken Sie auf Erstellen, um das Abo zu erstellen.

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 bietet eine Validierungsfunktion, mit der Sie ein SMT validieren können. Führen Sie den Befehl gcloud pubsub message-transforms validate aus:

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

    Ersetzen Sie Folgendes:

    • TRANSFORM_FILE: Der Pfad zur YAML- oder JSON-Datei, die ein einzelnes SMT enthält.

      Hier ist ein Beispiel für eine YAML-Transformationsdatei:

      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 bietet eine Testfunktion, mit der Sie das Ergebnis der Ausführung von einem oder mehreren SMTs für eine Beispielnachricht prüfen können. Führen Sie den Befehl gcloud pubsub message-transforms test aus:

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

    Ersetzen Sie Folgendes:

    • TRANSFORMS_FILE: Der Pfad zur YAML- oder JSON-Datei, die ein oder mehrere SMTs enthält.

      Hier ist ein Beispiel für eine YAML-Datei mit Transformationen:

      - 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: Nachrichtentext, mit dem die SMTs getestet werden sollen.

    • ATTRIBUTES: Nachrichtenattribute, mit denen die SMTs getestet werden sollen.

  4. Führen Sie den Befehl gcloud pubsub subscriptions create aus, um das Abo zu erstellen:

    gcloud pubsub subscriptions create SUBSCRIPTION_ID \
        --topic=TOPIC_NAME \
        --message-transforms-file=TRANSFORMS_FILE

    Ersetzen Sie Folgendes:

    • SUBSCRIPTION_ID: Die ID oder der Name des Abos, das Sie erstellen möchten. Richtlinien zum Benennen eines Abos finden Sie unter Ressourcennamen. Der Name eines Abos ist unveränderlich.

    • TOPIC_NAME: Der Name des Themas, das abonniert werden soll, im Format projects/PROJECT_ID/topics/TOPIC_ID.

    • TRANSFORMS_FILE: Der Pfad zur YAML- oder JSON-Datei, die ein oder mehrere SMTs enthält.

      Hier ist ein Beispiel für eine YAML-Datei mit Transformationen:

      - 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

Folgen Sie der Einrichtungsanleitung für Java in der Pub/Sub-Kurzanleitung: Clientbibliotheken verwenden, bevor Sie dieses Beispiel anwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Java API.

Richten Sie zur Authentifizierung bei Pub/Sub Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
import com.google.pubsub.v1.JavaScriptUDF;
import com.google.pubsub.v1.MessageTransform;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.ProjectTopicName;
import com.google.pubsub.v1.Subscription;
import java.io.IOException;

public class CreateSubscriptionWithSmtExample {
  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";
    String subscriptionId = "your-subscription-id";

    createSubscriptionWithSmtExample(projectId, topicId, subscriptionId);
  }

  public static void createSubscriptionWithSmtExample(
      String projectId, String topicId, String subscriptionId) throws IOException {

    // 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 (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {

      ProjectTopicName topicName = ProjectTopicName.of(projectId, topicId);
      ProjectSubscriptionName subscriptionName =
          ProjectSubscriptionName.of(projectId, subscriptionId);

      Subscription subscription =
          subscriptionAdminClient.createSubscription(
              Subscription.newBuilder()
                  .setName(subscriptionName.toString())
                  .setTopic(topicName.toString())
                  // Add the UDF message transform
                  .addMessageTransforms(transform)
                  .build());

      System.out.println("Created subscription with SMT: " + subscription.getAllFields());
    }
  }
}

Python

Folgen Sie der Einrichtungsanleitung für Python in der Pub/Sub-Kurzanleitung: Clientbibliotheken verwenden, bevor Sie dieses Beispiel anwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Python API.

Richten Sie zur Authentifizierung bei Pub/Sub Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

from google.cloud import pubsub_v1
from google.pubsub_v1.types import JavaScriptUDF, MessageTransform

# TODO(developer): Choose an existing topic.
# project_id = "your-project-id"
# topic_id = "your-topic-id"
# subscription_id = "your-subscription-id"

publisher = pubsub_v1.PublisherClient()
subscriber = pubsub_v1.SubscriberClient()
topic_path = publisher.topic_path(project_id, topic_id)
subscription_path = subscriber.subscription_path(project_id, subscription_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)]

with subscriber:
    subscription = subscriber.create_subscription(
        request={
            "name": subscription_path,
            "topic": topic_path,
            "message_transforms": transforms,
        }
    )
    print(f"Created subscription with SMT: {subscription}")

Go

Folgen Sie der Einrichtungsanleitung für Go in der Pub/Sub-Kurzanleitung: Clientbibliotheken verwenden, bevor Sie dieses Beispiel anwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Go API.

Richten Sie zur Authentifizierung bei Pub/Sub Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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

import (
	"context"
	"fmt"
	"io"

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

// createSubscriptionWithSMT creates a subscription with a single message transform function applied.
func createSubscriptionWithSMT(w io.Writer, projectID, subID string, topic *pubsub.Topic) error {
	// projectID := "my-project-id"
	// subID := "my-sub"
	// topic of type https://godoc.org/cloud.google.com/go/pubsub#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.SubscriptionConfig{
		Topic:             topic,
		MessageTransforms: []pubsub.MessageTransform{transform},
	}
	sub, err := client.CreateSubscription(ctx, subID, cfg)
	if err != nil {
		return fmt.Errorf("CreateSubscription: %w", err)
	}
	fmt.Fprintf(w, "Created subscription with message transform: %v\n", sub)
	return nil
}

Interaktion von SMTs mit anderen Abofunktionen

Wenn in Ihrem Abo sowohl SMTs als auch die integrierten Filter von Pub/Sub verwendet werden, wird der Filter vor dem SMT angewendet. Dies hat folgende Auswirkungen:

  • Wenn Ihr SMT die Nachrichtenattribute ändert, wird der Pub/Sub-Filter nicht auf die neuen Attribute angewendet.
  • Ihr SMT wird nicht auf Nachrichten angewendet, die vom Pub/Sub-Filter herausgefiltert wurden.

Wenn Ihr SMT Nachrichten herausfiltert, sollten Sie sich über die Auswirkungen auf die Überwachung Ihres Abo-Rückstands im Klaren sein. Wenn Sie das Abo in eine Dataflow-Pipeline einspeisen, filtern Sie Nachrichten nicht mit dem SMT heraus, da dies die automatische Skalierung von Dataflow beeinträchtigt.

Nächste Schritte