Membuat langganan dengan SMT

Dokumen ini menjelaskan cara membuat langganan Pub/Sub dengan Transformasi Pesan Tunggal (SMT).

SMT langganan memungkinkan modifikasi ringan pada data dan atribut pesan langsung dalam Pub/Sub. Fitur ini memungkinkan pembersihan, pemfilteran, atau konversi format data sebelum pesan dikirim ke klien subscriber.

Untuk membuat langganan dengan SMT, Anda dapat menggunakan Google Cloud konsol, Google Cloud CLI, library klien, atau Pub/Sub API.

Sebelum memulai

Peran dan izin yang diperlukan

Untuk mendapatkan izin yang diperlukan guna membuat langganan dengan SMT, minta administrator Anda untuk memberi Anda peran IAM Pub/Sub Editor (roles/pubsub.editor) di project Anda. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Peran bawaan ini berisi izin yang diperlukan untuk membuat langganan dengan SMT. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk membuat langganan dengan SMT:

  • Berikan izin membuat langganan pada project: pubsub.subscriptions.create

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Bergantung pada jenis langganan, Anda mungkin memerlukan izin tambahan. Untuk mengetahui daftar izin yang tepat, lihat dokumen yang membahas pembuatan langganan tertentu. Misalnya, jika Anda membuat langganan BigQuery dengan SMT, lihat halaman Membuat langganan BigQuery.

Jika Anda membuat langganan di project yang berbeda dengan topik, Anda harus memberikan peran roles/pubsub.subscriber kepada akun utama project yang berisi langganan di project yang berisi topik.

Anda dapat mengonfigurasi kontrol akses di tingkat project dan di tingkat resource individual.

Membuat langganan dengan SMT

Sebelum membuat langganan dengan SMT, tinjau dokumentasi untuk Properti langganan.

Contoh berikut mengasumsikan bahwa Anda ingin membuat langganan dengan SMT User Defined Function (UDF) ini. Untuk mengetahui informasi selengkapnya tentang UDF, lihat Ringkasan UDF.

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

Konsol

  1. Di konsol Google Cloud , buka halaman Subscriptions Pub/Sub.

    Buka Langganan

  2. Klik Buat langganan.

    Halaman Buat langganan akan terbuka.

  3. Di kolom Subscription ID, masukkan ID untuk langganan Anda. Untuk mengetahui informasi selengkapnya tentang penamaan langganan, lihat pedoman penamaan.

  4. Di bagian Transformasi, klik Tambahkan transformasi.

  5. Masukkan nama fungsi. Misalnya: redactSSN.

  6. Jika Anda tidak ingin langsung menggunakan SMT dengan langganan, klik opsi Nonaktifkan transformasi. SMT akan tetap disimpan, tetapi tidak akan dieksekusi saat pesan mengalir melalui langganan Anda.

  7. Masukkan transformasi baru. Contoh:

    function redactSSN(message, metadata) {
      const data = JSON.parse(message.data);
      delete data['ssn'];
      message.data = JSON.stringify(data);
      return message;
    }
  8. Pub/Sub menyediakan fungsi validasi yang memungkinkan Anda memvalidasi SMT. Klik Validasi untuk memvalidasi transformasi.

  9. Jika Anda ingin menambahkan transformasi lain, klik Tambahkan transformasi.

  10. Untuk mengatur semua SMT dalam urutan tertentu, Anda dapat menggunakan panah atas dan bawah. Untuk menghapus SMT, klik tombol hapus.
  11. Pub/Sub menyediakan fungsi pengujian yang memungkinkan Anda memeriksa hasil menjalankan SMT pada contoh pesan. Untuk menguji SMT, klik Uji transformasi.

  12. Di jendela Test transform, pilih fungsi yang ingin Anda uji.

  13. Di jendela Input message, masukkan contoh pesan.

  14. Jika Anda ingin menambahkan atribut pesan, klik Tambahkan atribut, lalu masukkan satu atau beberapa pasangan nilai kunci.

  15. Klik Uji. Hasil penerapan SMT pada pesan akan ditampilkan.

  16. Tutup jendela untuk berhenti menguji SMT pada contoh pesan.

  17. Klik Buat untuk membuat langganan.

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 menyediakan fungsi validasi yang memungkinkan Anda memvalidasi SMT. Jalankan perintah gcloud pubsub message-transforms validate:

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

    Ganti kode berikut:

    • TRANSFORM_FILE: Jalur ke file YAML atau JSON yang berisi satu SMT.

      Berikut adalah contoh file transformasi 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 menyediakan fungsi pengujian yang memungkinkan Anda memeriksa hasil menjalankan satu atau beberapa SMT pada contoh pesan. Jalankan perintah gcloud pubsub message-transforms test:

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

    Ganti kode berikut:

    • TRANSFORMS_FILE: Jalur ke file YAML atau JSON yang berisi satu atau beberapa SMT.

      Berikut adalah contoh file transformasi 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: Isi pesan yang akan digunakan untuk menguji SMT.

    • ATTRIBUTES: Atribut pesan yang akan digunakan untuk menguji SMT.

  4. Untuk membuat langganan, jalankan perintah gcloud pubsub subscriptions create:

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

    Ganti kode berikut:

    • SUBSCRIPTION_ID: ID atau nama langganan yang ingin Anda buat. Untuk mengetahui panduan tentang cara memberi nama langganan, lihat Nama resource. Nama langganan tidak dapat diubah.

    • TOPIC_NAME: Nama topik yang akan disubscribe, dalam format projects/PROJECT_ID/topics/TOPIC_ID.

    • TRANSFORMS_FILE: Jalur ke file YAML atau JSON yang berisi satu atau beberapa SMT.

      Berikut adalah contoh file transformasi 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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai Pub/Sub menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Java Pub/Sub.

Untuk melakukan autentikasi ke Pub/Sub, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai Pub/Sub menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Pub/Sub.

Untuk melakukan autentikasi ke Pub/Sub, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan memulai Pub/Sub menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Go Pub/Sub.

Untuk melakukan autentikasi ke Pub/Sub, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Cara SMT berinteraksi dengan fitur langganan lainnya

Jika langganan Anda menggunakan SMT dan filter bawaan Pub/Sub, maka filter akan diterapkan sebelum SMT. Hal ini memiliki implikasi berikut:

  • Jika SMT Anda mengubah atribut pesan, filter Pub/Sub tidak akan diterapkan ke kumpulan atribut baru.
  • SMT Anda tidak akan diterapkan ke pesan apa pun yang difilter oleh filter Pub/Sub.

Jika SMT memfilter pesan, perhatikan dampaknya terhadap pemantauan backlog langganan Anda. Jika Anda memasukkan langganan ke pipeline Dataflow, jangan memfilter pesan menggunakan SMT karena akan mengganggu penskalaan otomatis Dataflow.

Langkah berikutnya