Membuat topik dengan SMT

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

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

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

Sebelum memulai

Peran dan izin yang diperlukan

Untuk mendapatkan izin yang diperlukan guna membuat topik dengan SMT, minta administrator 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 topik dengan SMT. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk membuat topik dengan SMT:

  • Berikan izin membuat topik pada project: pubsub.topics.create

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

Anda dapat mengonfigurasi kontrol akses di level project dan di level resource masing-masing.

Membuat topik dengan SMT

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

Untuk membuat Pub/Sub dengan satu atau beberapa SMT, lakukan langkah-langkah berikut.

Konsol

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

    Buka Topik

  2. Klik Create topic.

  3. Di kolom Topic ID, masukkan ID untuk topik Anda. Untuk mengetahui informasi selengkapnya tentang penamaan topik, lihat panduan penamaan.

  4. Di bagian Transformasi, klik Tambahkan transformasi.

  5. Masukkan nama fungsi. Misalnya: redactSSN.

  6. Jika Anda tidak ingin SMT aktif segera, pilih Nonaktifkan transformasi. Jika opsi ini dipilih, SMT akan dibuat dengan topik, tetapi tidak dijalankan pada pesan masuk. Setelah topik dibuat, Anda dapat mengedit topik untuk mengaktifkan SMT.

  7. Di area teks, masukkan kode untuk SMT. Contoh:

    function redactSSN(message, metadata) {
      const data = JSON.parse(message.data);
      delete data['ssn'];
      message.data = JSON.stringify(data);
      return message;
    }
    
  8. Opsional. Untuk memvalidasi SMT, klik Validasi. Jika SMT valid, pesan "Validation passed" akan ditampilkan. Jika tidak, pesan error akan ditampilkan.

  9. Untuk menambahkan transformasi lain, klik Tambahkan transformasi dan ulangi langkah-langkah sebelumnya.

    Untuk mengatur SMT dalam urutan tertentu, klik Pindahkan ke atas atau Pindahkan ke bawah. Untuk menghapus SMT, klik Hapus.

  10. Opsional. Untuk menguji SMT pada contoh pesan, lakukan langkah-langkah berikut:

    1. Klik Uji transformasi.

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

    3. Di jendela Input pesan, masukkan contoh pesan.

    4. Untuk menambahkan atribut ke pesan, klik Tambahkan atribut dan masukkan kunci dan nilai atribut. Anda dapat menambahkan beberapa atribut.

    5. Klik Uji. Hasil penerapan SMT pada pesan ditampilkan di bagian Output message.

    6. Untuk menutup jendela Uji transformasi, klik Tutup.

    Jika membuat lebih dari satu SMT, Anda dapat menguji seluruh urutan transformasi sebagai berikut:

    1. Uji SMT pertama dalam urutan, seperti yang dijelaskan dalam langkah-langkah sebelumnya.
    2. Pilih SMT berikutnya. Pesan input diisi otomatis dengan pesan output dari pengujian sebelumnya.
    3. Lanjutkan pengujian SMT secara berurutan, untuk memastikan seluruh urutan berfungsi seperti yang diharapkan.
  11. Untuk membuat topik, klik Buat.

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. Buat file YAML atau JSON yang menentukan satu atau beberapa SMT. Jika Anda memiliki lebih dari satu SMT, SMT tersebut akan dieksekusi pada pesan sesuai urutan yang Anda cantumkan.

    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. Opsional. Untuk 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 menentukan satu SMT. Jika membuat beberapa SMT, Anda harus memvalidasinya satu per satu.
  4. Opsional. Untuk menguji satu atau beberapa SMT pada contoh pesan Pub/Sub, jalankan perintah gcloud pubsub message-transforms test:

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

    Ganti kode berikut:

    • TRANSFORMS_FILE: Jalur ke file YAML atau JSON yang menentukan satu atau beberapa SMT.
    • MESSAGE: Isi contoh pesan.
    • ATTRIBUTES: Opsional. Daftar atribut pesan yang dipisahkan koma. Setiap atribut adalah pasangan nilai kunci yang diformat sebagai KEY="VALUE".

    Perintah menjalankan SMT secara berurutan, menggunakan output dari setiap SMT sebagai input ke SMT berikutnya. Perintah ini akan menampilkan hasil setiap langkah.

  5. Untuk membuat topik, jalankan perintah gcloud pubsub topics create:

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

    Ganti kode berikut:

    • TOPIC_ID: ID atau nama topik yang ingin Anda buat. Untuk mengetahui panduan cara memberi nama topik, lihat Nama resource. Nama topik tidak dapat diubah.
    • TRANSFORMS_FILE: Jalur ke file YAML atau JSON yang menentukan satu atau beberapa SMT.
  6. Java

    Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Java API Pub/Sub.

    
    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

    Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi 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

    Contoh berikut menggunakan versi utama library klien Go Pub/Sub (v2). Jika Anda masih menggunakan library v1, lihat panduan migrasi ke v2. Untuk melihat daftar contoh kode v1, lihat contoh kode yang tidak digunakan lagi.

    Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Go Pub/Sub.

    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
    }
    

Langkah berikutnya