Membuat langganan Cloud Storage

Dokumen ini menjelaskan cara membuat langganan Cloud Storage. Anda dapat menggunakan konsol Google Cloud , Google Cloud CLI, library klien, atau Pub/Sub API untuk membuat langganan Cloud Storage.

Sebelum memulai

Sebelum membaca dokumen ini, pastikan Anda memahami hal-hal berikut:

Peran dan izin yang diperlukan

Untuk mendapatkan izin yang diperlukan guna membuat langganan Cloud Storage, minta administrator untuk memberi Anda peran IAM Pub/Sub Editor (roles/pubsub.editor) di project. 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 Cloud Storage. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk membuat langganan Cloud Storage:

  • pubsub.subscriptions.create di project
  • pubsub.topics.attachSubscription tentang topik

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

Langganan lintas project

Jika membuat langganan di satu project untuk topik di project lain, Anda harus memiliki izin pubsub.subscriptions.create di project tempat Anda membuat langganan, dan izin pubsub.topics.attachSubscription di topik.

Memberikan peran IAM ke akun layanan

Pub/Sub menggunakan akun layanan Identity and Access Management (IAM) untuk mengakses resource. Google Cloud Secara default, akun ini menggunakan agen layanan Pub/Sub (service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com).

Agar Pub/Sub dapat menulis ke Cloud Storage, akun layanan memerlukan peran berikut:

  • Storage Object Creator (roles/storage.objectCreator)
  • Storage Legacy Bucket Reader (roles/storage.legacyBucketReader)

Anda dapat memberikan izin akun layanan untuk project atau bucket Cloud Storage, sebagai berikut:

Project

  1. Di konsol Google Cloud , buka halaman Buckets.

    Buka Buckets

  2. Pilih Sertakan pemberian peran yang disediakan Google.

  3. Temukan baris untuk akun layanan Cloud Pub/Sub, lalu klik Edit principal.

  4. Klik Tambahkan peran lain, lalu pilih peran Storage Object Creator. Ulangi langkah ini untuk peran Storage Legacy Bucket Reader.

Untuk mengetahui informasi selengkapnya, lihat Memberikan peran IAM menggunakan konsol.

Bucket Cloud Storage

  1. Di konsol Google Cloud , buka Buckets.

    Buka Buckets

  2. Klik nama bucket Cloud Storage yang ingin Anda beri izin.

  3. Di halaman Bucket details, klik tab Permissions.

  4. Di panel Permissions, klik tab View by principals.

  5. Klik Grant access.

  6. Di kolom New principals, masukkan ID akun layanan, dalam format berikut:

    service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com.

  7. Di daftar Assign roles, pilih Storage Object Creator.

  8. Klik Add another role, lalu pilih Storage Legacy Bucket Reader.

  9. Klik Simpan. Akun utama diberi peran pada resource.

Menggunakan akun layanan khusus

Dengan memberikan peran Storage Object Creator dan Storage Legacy Bucket Reader kepada akun layanan Cloud Pub/Sub, setiap pengguna yang memiliki izin untuk membuat langganan di project Anda dapat menulis ke bucket Cloud Storage. Jika Anda ingin memberikan izin yang lebih terperinci, konfigurasi akun layanan yang dikelola pengguna saja.

Izin berikut diperlukan untuk mengonfigurasi akun layanan yang dikelola pengguna agar dapat menulis ke Cloud Storage:

  • Akun layanan yang dikelola pengguna harus memiliki peran Storage Object Creator dan Storage Legacy Bucket Reader.

  • Akun layanan Cloud Pub/Sub harus memiliki izin iam.serviceAccounts.getAccessToken di akun layanan yang dikelola pengguna.

  • Pengguna yang membuat langganan harus memiliki izin iam.serviceAccounts.actAs di akun layanan yang dikelola pengguna.

Saat membuat langganan, tentukan akun layanan yang dikelola pengguna sebagai akun layanan langganan.

Properti langganan Cloud Storage

Langganan Cloud Storage mendukung semua properti langganan umum. Bagian berikut menjelaskan properti yang khusus untuk langganan Cloud Storage.

Nama bucket

Bucket Cloud Storage harus sudah ada sebelum Anda membuat langganan Cloud Storage.

Pesan dikirim sebagai batch dan disimpan di bucket Cloud Storage. Satu batch atau file disimpan sebagai objek dalam bucket.

Bucket Cloud Storage harus menonaktifkan Requester Pays.

Untuk membuat bucket Cloud Storage, lihat Membuat bucket.

Awalan, akhiran, dan tanggal waktu nama file

File Cloud Storage output yang dihasilkan oleh langganan Cloud Storage disimpan sebagai objek di bucket Cloud Storage. Nama objek yang disimpan di bucket Cloud Storage memiliki format berikut: <file-prefix><UTC-date-time>_<uuid><file-suffix>.

Daftar berikut mencakup detail format file dan kolom yang dapat Anda sesuaikan:

  • <file-prefix> adalah awalan nama file kustom. Kolom ini bersifat opsional.

  • <UTC-date-time> adalah string yang dibuat otomatis dan dapat disesuaikan berdasarkan waktu saat objek dibuat.

  • <uuid> adalah string acak yang dibuat otomatis untuk objek.

  • <file-suffix> adalah sufiks nama file kustom. Kolom ini bersifat opsional. Sufiks nama file tidak boleh diakhiri dengan "/".

  • Anda dapat mengubah awalan dan akhiran nama file:

    • Misalnya, jika nilai awalan nama file adalah prod_ dan nilai akhiran nama file adalah _archive, contoh nama objek adalah prod_2023-09-25T04:10:00+00:00_uN1QuE_archive.

    • Jika Anda tidak menentukan awalan dan akhiran nama file, nama objek yang disimpan di bucket Cloud Storage akan memiliki format: <UTC-date-time>_<uuid>.

    • Persyaratan penamaan objek Cloud Storage juga berlaku untuk awalan dan akhiran nama file. Untuk mengetahui informasi selengkapnya, lihat Tentang objek Cloud Storage.

  • Anda dapat mengubah cara tanggal dan waktu ditampilkan dalam nama file:

    • Pencocokan tanggal dan waktu wajib yang hanya dapat Anda gunakan satu kali: tahun (YYYY atau YY), bulan (MM), hari (DD), jam (hh), menit (mm), detik (ss). Misalnya, YY-YYYY atau MMM tidak valid.

    • Pencocok opsional yang dapat Anda gunakan hanya sekali: pemisah tanggal dan waktu (T) dan dan selisih zona waktu (Z atau +00:00).

    • Elemen opsional yang dapat Anda gunakan beberapa kali: tanda hubung (-), garis bawah (_), titik dua (:), dan garis miring (/).

    • Misalnya, jika nilai format tanggal waktu nama file adalah YYYY-MM-DD/hh_mm_ssZ, contoh nama objek adalah prod_2023-09-25/04_10_00Z_uNiQuE_archive.

    • Jika format tanggal dan waktu nama file diakhiri dengan karakter yang bukan pencocok, karakter tersebut akan menggantikan pemisah antara <UTC-date-time> dan <uuid>. Misalnya, jika nilai format tanggal waktu nama file adalah YYYY-MM-DDThh_mm_ss-, contoh nama objek adalah prod_2023-09-25T04_10_00-uNiQuE_archive.

Pengelompokan file

Langganan Cloud Storage memungkinkan Anda memutuskan kapan Anda ingin membuat file output baru yang disimpan sebagai objek di bucket Cloud Storage. Pub/Sub menulis file output saat salah satu kondisi batching yang ditentukan terpenuhi. Berikut adalah kondisi batching Cloud Storage:

  • Durasi maksimum batch penyimpanan. Ini adalah setelan yang wajib diisi. Pub/Sub menulis file output baru jika nilai yang ditentukan untuk durasi maksimum terlampaui. Durasi diukur dari saat Pub/Sub mulai menulis ke file baru hingga file diselesaikan. Misalnya, jika Anda menetapkan durasi maksimum 5 menit, Pub/Sub akan menyelesaikan file paling lama 5 menit setelah Pub/Sub mulai menulis ke file. File baru dapat dibuat sebelum durasi maksimum berlalu. Jika Anda tidak menentukan nilai, nilai default 5 menit akan diterapkan. Berikut adalah nilai yang berlaku untuk durasi maks:

    • Nilai minimum = 1 menit
    • Nilai default = 5 menit
    • Nilai maksimum = 10 menit
  • Byte maksimum batch penyimpanan. Setelan ini bersifat opsional. Langganan Cloud Storage menulis file output baru jika nilai maksimum byte yang ditentukan terlampaui. Berikut adalah nilai yang berlaku untuk byte maks:

    • Nilai minimum = 1 KB
    • Nilai maksimum = 10 GiB
  • Pesan maksimum batch penyimpanan. Setelan ini bersifat opsional. Langganan Cloud Storage menulis file output baru jika jumlah pesan maksimum yang ditentukan terlampaui. Berikut adalah nilai yang berlaku untuk pesan maks:

    • Nilai minimum = 1000

Misalnya, Anda dapat mengonfigurasi durasi maks. 6 menit dan byte maks. 2 GB. Jika pada menit ke-4, file output mencapai ukuran file 2 GB, Pub/Sub akan menyelesaikan file sebelumnya dan mulai menulis ke file baru.

Langganan Cloud Storage dapat menulis ke beberapa file di bucket Cloud Storage secara bersamaan. Jika telah mengonfigurasi langganan untuk membuat file baru setiap menit ke-6, Anda mungkin melihat beberapa file Cloud Storage dibuat setiap 6 menit.

Dalam beberapa situasi, Pub/Sub mungkin mulai menulis ke file baru lebih awal dari waktu yang dikonfigurasi oleh kondisi pengelompokan file. File juga dapat melebihi nilai Byte maks jika langganan menerima pesan yang lebih besar dari nilai Byte maks.

Format file

Saat membuat langganan Cloud Storage, Anda dapat menentukan format file output yang akan disimpan di bucket Cloud Storage sebagai Teks atau Avro.

  • Teks: Pesan disimpan sebagai teks biasa. Karakter baris baru memisahkan pesan dari pesan sebelumnya dalam file. Hanya payload pesan yang disimpan, bukan atribut atau metadata lainnya.

  • Avro: Pesan disimpan dalam format biner Apache Avro. Saat memilih Avro, Anda dapat mengaktifkan properti tambahan berikut:

    • Tulis metadata: Opsi ini memungkinkan Anda menyimpan metadata pesan bersama dengan pesan. Metadata seperti kolom subscription_name, message_id, publish_time, dan attributes ditulis ke kolom tingkat teratas dalam objek Avro output, sementara semua properti pesan lainnya selain data (misalnya, ordering_key, jika ada) ditambahkan sebagai entri dalam peta attributes.

      Jika write metadata dinonaktifkan, hanya payload pesan yang ditulis ke objek Avro output. Berikut adalah skema Avro untuk pesan output dengan tulis metadata dinonaktifkan:

      {
        "type": "record",
        "namespace": "com.google.pubsub",
        "name": "PubsubMessage",
        "fields": [
          { "name": "data", "type": "bytes" }
        ]
      }
      

      Berikut adalah skema Avro untuk pesan output dengan tulis metadata yang diaktifkan:

      {
        "type": "record",
        "namespace": "com.google.pubsub",
        "name": "PubsubMessageWithMetadata",
        "fields": [
          { "name": "subscription_name", "type": "string" },
          { "name": "message_id", "type": "string"  },
          { "name": "publish_time", "type": {
              "type": "long",
              "logicalType": "timestamp-micros"
            }
          },
          { "name": "attributes", "type": { "type": "map", "values": "string" } },
          { "name": "data", "type": "bytes" }
        ]
      }
      
    • Gunakan skema topik: Opsi ini memungkinkan Pub/Sub menggunakan skema topik Pub/Sub yang menjadi tujuan langganan saat menulis file Avro.

      Saat Anda menggunakan opsi ini, jangan lupa untuk memeriksa persyaratan tambahan berikut:

      • Skema topik harus dalam format Apache Avro.

      • Jika gunakan skema topik dan tulis metadata diaktifkan, skema topik harus memiliki objek Record di root-nya. Pub/Sub akan memperluas daftar kolom Record untuk menyertakan kolom metadata. Akibatnya, Rekaman tidak boleh berisi kolom dengan nama yang sama dengan kolom metadata (subscription_name, message_id, publish_time, atau attributes).

Akun layanan

Anda memiliki opsi berikut untuk menulis pesan ke bucket Cloud Storage:

  • Konfigurasi akun layanan kustom sehingga hanya pengguna yang memiliki izin iam.serviceAccounts.actAs di akun layanan yang dapat membuat langganan yang menulis ke bucket. Contoh peran yang menyertakan izin iam.serviceAccounts.actAs adalah peran Service Account User (roles/iam.serviceAccountUser).

  • Gunakan agen layanan Pub/Sub default yang memungkinkan pengguna mana pun dengan kemampuan untuk membuat langganan di project guna membuat langganan yang menulis ke bucket. Agen layanan Pub/Sub adalah setelan default jika Anda tidak menentukan akun layanan kustom.

Membuat langganan Cloud Storage

Konsol

  1. Di konsol Google Cloud , buka halaman Subscriptions.

    Buka Langganan

  2. Klik Buat langganan.

  3. Untuk kolom Subscription ID, masukkan nama.

    Untuk mengetahui informasi tentang cara memberi nama langganan, lihat Pedoman untuk memberi nama topik atau langganan.

  4. Pilih atau buat topik dari menu drop-down.

    Langganan menerima pesan dari topik.

    Untuk mengetahui informasi tentang cara membuat topik, lihat Membuat dan mengelola topik.

  5. Pilih Jenis pengiriman sebagai Tulis ke Cloud Storage.

  6. Untuk bucket Cloud Storage, klik Browse.

    • Anda dapat memilih bucket yang ada dari project yang sesuai.

    • Anda juga dapat mengklik ikon buat dan mengikuti petunjuk di layar untuk membuat bucket baru.

      Setelah membuat bucket, pilih bucket untuk langganan Cloud Storage.

      Untuk mengetahui informasi selengkapnya tentang cara membuat bucket, lihat Membuat bucket.

    Saat Anda menentukan bucket, Pub/Sub akan memeriksa izin yang sesuai pada bucket untuk agen layanan Pub/Sub. Jika ada masalah izin, Anda akan melihat pesan yang mirip dengan berikut: Unable to verify if the Pub/Sub service agent has write permissions on this bucket. You may be lacking permissions to view or set permissions.

  7. Jika Anda mengalami masalah izin, klik Setel Izin dan ikuti petunjuk di layar.

    Atau, ikuti petunjuk di Menetapkan peran Cloud Storage ke agen layanan Pub/Sub.

  8. Untuk File format, pilih Text atau Avro.

    Jika memilih Avro, Anda juga dapat menentukan secara opsional apakah Anda ingin menyimpan metadata pesan dalam output.

    Untuk mengetahui informasi selengkapnya tentang kedua opsi tersebut, termasuk opsi metadata pesan untuk format Avro, lihat Format file.

  9. Opsional: Anda dapat menentukan Awalan, akhiran, dan tanggal waktu nama file untuk semua file yang akan ditulis ke bucket Cloud Storage. File disimpan sebagai objek dalam bucket.

    Untuk mengetahui informasi selengkapnya tentang cara menetapkan awalan, akhiran, dan tanggal waktu file, lihat Awalan, akhiran, dan tanggal waktu nama file.

  10. Untuk Pengelompokan file, tentukan waktu maksimum yang akan berlalu sebelum membuat file baru.

    Anda juga dapat secara opsional menetapkan ukuran file maksimum atau jumlah maksimum pesan untuk file.

    Untuk mengetahui informasi selengkapnya tentang kedua opsi pengelompokan file, lihat Pengelompokan file.

  11. Sebaiknya aktifkan Surat yang tidak terkirim untuk menangani kegagalan pesan.

    Untuk mengetahui informasi selengkapnya, lihat Topik dead letter.

  12. Anda dapat tetap menggunakan nilai default untuk setelan lainnya, lalu klik Create.

gcloud

  1. Di konsol Google Cloud , aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah konsol Google Cloud , sesi Cloud Shell akan dimulai dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi pada sesi.

  2. Untuk membuat langganan Cloud Storage, jalankan perintah gcloud pubsub subscriptions create.
    gcloud pubsub subscriptions create SUBSCRIPTION_ID \
        --topic=TOPIC_ID \
        --cloud-storage-bucket=BUCKET_NAME \
        --cloud-storage-file-prefix=CLOUD_STORAGE_FILE_PREFIX \
        --cloud-storage-file-suffix=CLOUD_STORAGE_FILE_SUFFIX \
        --cloud-storage-file-datetime-format=CLOUD_STORAGE_FILE_DATETIME_FORMAT \
        --cloud-storage-max-duration=CLOUD_STORAGE_MAX_DURATION \
        --cloud-storage-max-bytes=CLOUD_STORAGE_MAX_BYTES \
        --cloud-storage-max-messages=CLOUD_STORAGE_MAX_MESSAGES \
        --cloud-storage-output-format=CLOUD_STORAGE_OUTPUT_FORMAT \
        --cloud-storage-write-metadata
        --cloud-storage-use-topic-schema

    Jika Anda ingin menggunakan akun layanan kustom, berikan sebagai argumen tambahan:

    gcloud pubsub subscriptions create SUBSCRIPTION_ID \
        --topic=TOPIC_ID \
        --cloud-storage-bucket=BUCKET_NAME \
        --cloud-storage-file-prefix=CLOUD_STORAGE_FILE_PREFIX \
        --cloud-storage-file-suffix=CLOUD_STORAGE_FILE_SUFFIX \
        --cloud-storage-file-datetime-format=CLOUD_STORAGE_FILE_DATETIME_FORMAT \
        --cloud-storage-max-duration=CLOUD_STORAGE_MAX_DURATION \
        --cloud-storage-max-bytes=CLOUD_STORAGE_MAX_BYTES \
        --cloud-storage-max-messages=CLOUD_STORAGE_MAX_MESSAGES \
        --cloud-storage-output-format=CLOUD_STORAGE_OUTPUT_FORMAT \
        --cloud-storage-write-metadata
        --cloud-storage-use-topic-schema
        --cloud-storage-service-account-email=SERVICE_ACCOUNT_NAME
        

    Dalam perintah, hanya SUBSCRIPTION_ID, flag --topic, dan flag --cloud-storage-bucket yang diperlukan. Flag lainnya bersifat opsional dan dapat dihilangkan.

    Ganti kode berikut:

    • SUBSCRIPTION_ID: Nama atau ID langganan Cloud Storage baru Anda.
    • TOPIC_ID: Nama atau ID topik Anda.
    • BUCKET_NAME: Menentukan nama bucket yang ada. Contoh, prod_bucket. Nama bucket tidak boleh menyertakan project ID. Untuk membuat bucket, lihat Membuat bucket.
    • CLOUD_STORAGE_FILE_PREFIX: Menentukan awalan untuk nama file Cloud Storage. Misalnya, log_events_.
    • CLOUD_STORAGE_FILE_SUFFIX: Menentukan akhiran untuk nama file Cloud Storage. Misalnya, .txt.
    • CLOUD_STORAGE_FILE_DATETIME_FORMAT: Menentukan format tanggal dan waktu untuk nama file Cloud Storage. Contoh, YYYY-MM-DD/hh_mm_ssZ.
    • CLOUD_STORAGE_MAX_DURATION: Durasi maksimum yang dapat berlalu sebelum file Cloud Storage baru dibuat. Nilai harus antara 1m dan 10m. Misalnya, 5m.
    • CLOUD_STORAGE_MAX_BYTES: Byte maksimum yang dapat ditulis ke file Cloud Storage sebelum file baru dibuat. Nilai harus antara 1 KB hingga 10 GB. Misalnya, 20MB.
    • CLOUD_STORAGE_MAX_MESSAGES: Jumlah maksimum pesan yang dapat ditulis ke file Cloud Storage sebelum file baru dibuat. Nilai harus lebih besar dari atau sama dengan 1000. Contoh, 100000.
    • CLOUD_STORAGE_OUTPUT_FORMAT: Format output untuk data yang ditulis ke Cloud Storage. Nilainya adalah sebagai berikut:
      • text: Pesan ditulis sebagai teks mentah, dipisahkan dengan baris baru.
      • avro: Pesan ditulis sebagai biner Avro. --cloud-storage-write-metadata dan --cloud-storage-use-topic-schema hanya memengaruhi langganan dengan format output avro.
    • SERVICE_ACCOUNT_NAME: Menentukan nama akun layanan yang akan digunakan untuk menulis ke Cloud Storage.

C++

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

Untuk melakukan autentikasi ke Pub/Sub, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

namespace pubsub = ::google::cloud::pubsub;
namespace pubsub_admin = ::google::cloud::pubsub_admin;
[](pubsub_admin::SubscriptionAdminClient client,
   std::string const& project_id, std::string const& topic_id,
   std::string const& subscription_id, std::string const& bucket) {
  google::pubsub::v1::Subscription request;
  request.set_name(
      pubsub::Subscription(project_id, subscription_id).FullName());
  request.set_topic(pubsub::Topic(project_id, topic_id).FullName());
  request.mutable_cloud_storage_config()->set_bucket(bucket);
  auto sub = client.CreateSubscription(request);
  if (!sub) {
    if (sub.status().code() == google::cloud::StatusCode::kAlreadyExists) {
      std::cout << "The subscription already exists\n";
      return;
    }
    throw std::move(sub).status();
  }

  std::cout << "The subscription was successfully created: "
            << sub->DebugString() << "\n";
}

C#

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

Untuk melakukan autentikasi ke Pub/Sub, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.


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

public class CreateCloudStorageSubscriptionSample
{
    public Subscription CreateCloudStorageSubscription(string projectId, string topicId, string subscriptionId,
        string bucket, string filenamePrefix, string filenameSuffix, TimeSpan maxDuration)
    {
        SubscriberServiceApiClient subscriber = SubscriberServiceApiClient.Create();
        TopicName topicName = TopicName.FromProjectTopic(projectId, topicId);
        SubscriptionName subscriptionName = SubscriptionName.FromProjectSubscription(projectId, subscriptionId);

        var subscriptionRequest = new Subscription
        {
            SubscriptionName = subscriptionName,
            TopicAsTopicName = topicName,
            CloudStorageConfig = new CloudStorageConfig
            {
                Bucket = bucket,
                FilenamePrefix = filenamePrefix,
                FilenameSuffix = filenameSuffix,
                MaxDuration = Duration.FromTimeSpan(maxDuration)
            }
        };
        var subscription = subscriber.CreateSubscription(subscriptionRequest);
        return subscription;
    }
}

Go

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go dalam 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 library klien.

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/pubsub/v2"
	"cloud.google.com/go/pubsub/v2/apiv1/pubsubpb"
	"google.golang.org/protobuf/types/known/durationpb"
)

// createCloudStorageSubscription creates a Pub/Sub subscription that exports messages to Cloud Storage.
func createCloudStorageSubscription(w io.Writer, projectID, topic, subscription, bucket string) error {
	// projectID := "my-project-id"
	// topic := "projects/my-project-id/topics/my-topic"
	// subscription := "projects/my-project/subscriptions/my-sub"
	// bucket := "my-bucket" // bucket must not have the gs:// prefix
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %w", err)
	}
	defer client.Close()

	sub, err := client.SubscriptionAdminClient.CreateSubscription(ctx, &pubsubpb.Subscription{
		Name:  subscription,
		Topic: topic,
		CloudStorageConfig: &pubsubpb.CloudStorageConfig{
			Bucket:         bucket,
			FilenamePrefix: "log_events_",
			FilenameSuffix: ".avro",
			OutputFormat: &pubsubpb.CloudStorageConfig_AvroConfig_{
				AvroConfig: &pubsubpb.CloudStorageConfig_AvroConfig{
					WriteMetadata: true,
				},
			},
			MaxDuration: durationpb.New(1 * time.Minute),
			MaxBytes:    1e8,
		},
	})
	if err != nil {
		return fmt.Errorf("failed to create cloud storage sub: %w", err)
	}
	fmt.Fprintf(w, "Created Cloud Storage subscription: %v\n", sub)

	return nil
}

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java dalam 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 library klien.

import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
import com.google.protobuf.Duration;
import com.google.pubsub.v1.CloudStorageConfig;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.ProjectTopicName;
import com.google.pubsub.v1.Subscription;
import java.io.IOException;

public class CreateCloudStorageSubscriptionExample {
  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";
    String bucket = "your-bucket";
    String filenamePrefix = "log_events_";
    String filenameSuffix = ".text";
    Duration maxDuration = Duration.newBuilder().setSeconds(300).build();

    createCloudStorageSubscription(
        projectId, topicId, subscriptionId, bucket, filenamePrefix, filenameSuffix, maxDuration);
  }

  public static void createCloudStorageSubscription(
      String projectId,
      String topicId,
      String subscriptionId,
      String bucket,
      String filenamePrefix,
      String filenameSuffix,
      Duration maxDuration)
      throws IOException {
    try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {

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

      CloudStorageConfig cloudStorageConfig =
          CloudStorageConfig.newBuilder()
              .setBucket(bucket)
              .setFilenamePrefix(filenamePrefix)
              .setFilenameSuffix(filenameSuffix)
              .setMaxDuration(maxDuration)
              .build();

      Subscription subscription =
          subscriptionAdminClient.createSubscription(
              Subscription.newBuilder()
                  .setName(subscriptionName.toString())
                  .setTopic(topicName.toString())
                  .setCloudStorageConfig(cloudStorageConfig)
                  .build());

      System.out.println("Created a CloudStorage subscription: " + subscription.getAllFields());
    }
  }
}

Node.js

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

Untuk melakukan autentikasi ke Pub/Sub, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */
// const topicName = 'YOUR_TOPIC_NAME';
// const subscriptionName = 'YOUR_SUBSCRIPTION_NAME';
// const bucket = 'YOUR_BUCKET_ID';
// const filenamePrefix = 'YOUR_FILENAME_PREFIX';
// const filenameSuffix = 'YOUR_FILENAME_SUFFIX';
// const maxDuration = 60;

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function createCloudStorageSubscription(
  topicName,
  subscriptionName,
  bucket,
  filenamePrefix,
  filenameSuffix,
  maxDuration,
) {
  const options = {
    cloudStorageConfig: {
      bucket,
      filenamePrefix,
      filenameSuffix,
      maxDuration: {
        seconds: maxDuration,
      },
    },
  };

  await pubSubClient
    .topic(topicName)
    .createSubscription(subscriptionName, options);

  console.log(
    `Created subscription ${subscriptionName} with a cloud storage configuration.`,
  );
}

Node.js

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

Untuk melakukan autentikasi ke Pub/Sub, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */
// const topicName = 'YOUR_TOPIC_NAME';
// const subscriptionName = 'YOUR_SUBSCRIPTION_NAME';
// const bucket = 'YOUR_BUCKET_ID';
// const filenamePrefix = 'YOUR_FILENAME_PREFIX';
// const filenameSuffix = 'YOUR_FILENAME_SUFFIX';
// const maxDuration = 60;

// Imports the Google Cloud client library
import {CreateSubscriptionOptions, PubSub} from '@google-cloud/pubsub';

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function createCloudStorageSubscription(
  topicName: string,
  subscriptionName: string,
  bucket: string,
  filenamePrefix: string,
  filenameSuffix: string,
  maxDuration: number,
) {
  const options: CreateSubscriptionOptions = {
    cloudStorageConfig: {
      bucket,
      filenamePrefix,
      filenameSuffix,
      maxDuration: {
        seconds: maxDuration,
      },
    },
  };

  await pubSubClient
    .topic(topicName)
    .createSubscription(subscriptionName, options);

  console.log(
    `Created subscription ${subscriptionName} with a cloud storage configuration.`,
  );
}

PHP

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

Untuk melakukan autentikasi ke Pub/Sub, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Creates a Pub/Sub GCS subscription.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 * @param string $subscriptionName  The Pub/Sub subscription name.
 * @param string $bucket The Cloud Storage bucket name without any prefix like "gs://".
 */
function create_cloud_storage_subscription($projectId, $topicName, $subscriptionName, $bucket)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $subscription = $topic->subscription($subscriptionName);
    $config = ['bucket' => $bucket];
    $subscription->create([
        'cloudStorageConfig' => $config
    ]);

    printf('Subscription created: %s' . PHP_EOL, $subscription->name());
}

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python dalam 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 library klien.

from google.cloud import pubsub_v1
from google.protobuf import duration_pb2

# TODO(developer)
# project_id = "your-project-id"
# topic_id = "your-topic-id"
# subscription_id = "your-subscription-id"
# bucket = "my-bucket"

filename_prefix = "log_events_"
filename_suffix = ".avro"
# Either CloudStorageConfig.AvroConfig or CloudStorageConfig.TextConfig
# defaults to TextConfig
avro_config = pubsub_v1.types.CloudStorageConfig.AvroConfig(write_metadata=True)

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)
max_duration = duration_pb2.Duration()
max_duration.FromSeconds(300)

cloudstorage_config = pubsub_v1.types.CloudStorageConfig(
    bucket=bucket,
    filename_prefix=filename_prefix,
    filename_suffix=filename_suffix,
    avro_config=avro_config,
    # Min 1 minutes, max 10 minutes
    max_duration=max_duration,
    # Min 1 KB, max 10 GiB
    max_bytes=10000000,
)

# Wrap the subscriber in a 'with' block to automatically call close() to
# close the underlying gRPC channel when done.
with subscriber:
    subscription = subscriber.create_subscription(
        request={
            "name": subscription_path,
            "topic": topic_path,
            "cloud_storage_config": cloudstorage_config,
        }
    )

print(f"CloudStorage subscription created: {subscription}.")
print(f"Bucket for subscription is: {bucket}")
print(f"Prefix is: {filename_prefix}")
print(f"Suffix is: {filename_suffix}")

Memantau langganan Cloud Storage

Cloud Monitoring menyediakan sejumlah metrik untuk memantau langganan.

Untuk mengetahui daftar semua metrik yang tersedia terkait Pub/Sub dan deskripsinya, lihat dokumentasi Monitoring untuk Pub/Sub.

Anda juga dapat memantau langganan dari dalam Pub/Sub.

Langkah berikutnya