トピックの作成

Pub/Sub では、トピックはメッセージのフィードを表す名前付きリソースです。トピックをパブリッシュまたはサブスクライブする前に、トピックを作成する必要があります。 Pub/Sub では、標準トピックとインポート トピックの 2 種類のトピックがサポートされています。

このドキュメントでは、Pub/Sub 標準トピックを作成する方法について説明します。インポート トピックの詳細と作成方法については、インポート トピックについてをご覧ください。

トピックを作成するには、 Trusted Cloud コンソール、Google Cloud CLI、クライアント ライブラリ、または Pub/Sub API を使用します。

始める前に

必要なロールと権限

トピックの作成に必要な権限を取得するには、プロジェクトに対する Pub/Sub 編集者(roles/pubsub.editor)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。

この事前定義ロールには、トピックの作成に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

トピックを作成するには、次の権限が必要です。

  • プロジェクトでトピックを作成する権限を付与します。 pubsub.topics.create

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

アクセス制御は、プロジェクト レベルと個々のリソースレベルで構成できます。あるプロジェクトにサブスクリプションを作成し、別のプロジェクトにあるトピックにアタッチできます。プロジェクトごとに必要な権限があることを確認します。

トピックのプロパティ

トピックを作成または更新するときは、そのプロパティを指定する必要があります。

デフォルトのサブスクリプションを追加する

Pub/Sub トピックにデフォルトのサブスクリプションを追加します。トピックの別のサブスクリプションは、そのトピックの作成後に作成できます。デフォルトのサブスクリプションには、次のプロパティがあります。

  • -sub のサブスクリプション ID
  • pull 配信タイプ
  • メッセージの保持期間が 7 日間
  • 非アクティブな状態が 31 日間までの有効期間
  • 確認応答の期限(10 秒)
  • 即時再試行ポリシー

取り込みを有効にする

このプロパティを有効にすると、外部ソースからトピックにストリーミング データを取り込んで、 Trusted Cloudの機能を利用できるようになります。取り込み用のインポート トピックを作成するには、以下をご覧ください。

メッセージ保持を有効にする

Pub/Sub トピックがパブリッシュ後にメッセージを保持する期間を指定します。メッセージの保持期間が経過すると、確認応答状態にかかわらず、Pub/Sub によりメッセージが破棄される可能性があります。トピックにパブリッシュされたすべてのメッセージの保存には、メッセージ ストレージ料金が発生します。

  • デフォルト = 無効
  • 最小値: 10 分。
  • 最大値: 31 日

メッセージ データを BigQuery にエクスポートする

このプロパティを有効にすると、メッセージを受信時に既存の BigQuery テーブルに書き込む BigQuery サブスクリプションを作成できます。別のサブスクライバー クライアントを構成する必要はありません。 BigQuery サブスクリプションの詳細については、BigQuery サブスクリプションをご覧ください。

メッセージ データを Cloud Storage にバックアップする

このプロパティを有効にすると、メッセージを受信したときに既存の Cloud Storage テーブルにメッセージを書き込む Cloud Storage サブスクリプションを作成できます。別のサブスクライバー クライアントを構成する必要はありません。 Cloud Storage サブスクリプションの詳細については、Cloud Storage サブスクリプションをご覧ください。

変換

トピック SMT を使用すると、Pub/Sub 内でメッセージ データと属性に対する軽量な変更を直接行うことができます。この機能を使用すると、メッセージがトピックにパブリッシュされる前に、データのクリーンアップ、フィルタリング、形式変換を行うことができます。

SMT の詳細については、SMT の概要をご覧ください。

Google Cloud-powered encryption key

トピックがGoogle Cloud-powered encryption keysを使用して暗号化されることを指定します。Pub/Sub はデフォルトで Google Cloud-powered encryption keys を使用してメッセージを暗号化するため、このオプションを選択するとデフォルトの動作が維持されます。鍵の管理とローテーションは Google が自動的に処理するため、メッセージは常に利用可能な最も強力な暗号化で保護されます。このオプションでは、これ以上の構成は必要ありません。 Google Cloud-powered encryption keysの詳細については、 Google Cloud-powered encryption keysによるデフォルトの暗号化をご覧ください。

Cloud KMS 鍵

トピックが顧客管理の暗号鍵(CMEK)で暗号化されているかどうかを指定します。Pub/Sub はデフォルトでは、 Google Cloud-powered encryption keys を使用してメッセージを暗号化します。このオプションを指定すると、Pub/Sub は CMEK でエンベロープ暗号化パターンを使用します。この方法では、Cloud KMS はメッセージを暗号化しません。代わりに、Cloud KMS は、各トピック用に Pub/Sub が作成するデータ暗号鍵(DEK)を暗号化します。メッセージは、トピック用に生成された最新の DEK を使用して Pub/Sub が暗号化します。Pub/Sub は、メッセージをサブスクライバーに配信する直前に復号します。鍵の作成の詳細については、メッセージ暗号化を構成するをご覧ください。

トピックの作成

トピックは、それを公開または登録する前に作成します。

Console

トピックを作成する方法は次のとおりです。

  1. Trusted Cloud コンソールで、Pub/Sub の [トピックの作成] ページに移動します。

    [トピックを作成する] に移動

  2. [トピック ID] フィールドに、トピックの ID を入力します。トピックの命名の詳細については、命名ガイドラインをご覧ください。

  3. [デフォルトのサブスクリプションを追加] オプションは、そのまま保持します。

  4. 省略可。他のオプションは選択しないでください。

  5. [トピックを作成] をクリックします。

gcloud

トピックを作成するには、gcloud pubsub topics create コマンドを実行します。

gcloud pubsub topics create TOPIC_ID

REST

トピックを作成するには、projects.topics.create メソッドを使用します。

リクエストは、Authorization ヘッダー内のアクセス トークンにより認証を受ける必要があります。現在のアプリケーションのデフォルト認証情報のアクセス トークンを取得する場合は、gcloud auth application-default print-access-token を使用します。

PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
Authorization: Bearer ACCESS_TOKEN

ここで

  • PROJECT_ID はプロジェクト ID です。
  • TOPIC_ID はトピック ID です。

レスポンス:

{
"name": "projects/PROJECT_ID/topics/TOPIC_ID"
}

C++

このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C++ の設定手順を実施してください。詳細については、Pub/Sub C++ API リファレンス ドキュメントをご覧ください。

namespace pubsub = ::google::cloud::pubsub;
namespace pubsub_admin = ::google::cloud::pubsub_admin;
[](pubsub_admin::TopicAdminClient client, std::string project_id,
   std::string topic_id) {
  auto topic = client.CreateTopic(
      pubsub::Topic(std::move(project_id), std::move(topic_id)).FullName());
  // Note that kAlreadyExists is a possible error when the library retries.
  if (topic.status().code() == google::cloud::StatusCode::kAlreadyExists) {
    std::cout << "The topic already exists\n";
    return;
  }
  if (!topic) throw std::move(topic).status();

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

C#

このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。


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

public class CreateTopicSample
{
    public Topic CreateTopic(string projectId, string topicId)
    {
        PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
        var topicName = TopicName.FromProjectTopic(projectId, topicId);
        Topic topic = null;

        try
        {
            topic = publisher.CreateTopic(topicName);
            Console.WriteLine($"Topic {topic.Name} created.");
        }
        catch (RpcException e) when (e.Status.StatusCode == StatusCode.AlreadyExists)
        {
            Console.WriteLine($"Topic {topicName} already exists.");
        }
        return topic;
    }
}

Go

次のサンプルでは、Go Pub/Sub クライアント ライブラリのメジャー バージョン(v2)を使用しています。まだ v1 ライブラリを使用している場合は、v2 への移行ガイドをご覧ください。v1 コードサンプルの一覧については、 非推奨のコードサンプルをご覧ください。

このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Go の設定手順を実施してください。詳細については、Pub/Sub Go API のリファレンス ドキュメントをご覧ください。

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsub/v2"
	"cloud.google.com/go/pubsub/v2/apiv1/pubsubpb"
)

func create(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()

	topic := &pubsubpb.Topic{
		Name: fmt.Sprintf("projects/%s/topics/%s", projectID, topicID),
	}
	t, err := client.TopicAdminClient.CreateTopic(ctx, topic)
	if err != nil {
		return fmt.Errorf("CreateTopic: %w", err)
	}
	fmt.Fprintf(w, "Topic created: %v\n", t)
	return nil
}

Java

このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API のリファレンス ドキュメントをご覧ください。


import com.google.cloud.pubsub.v1.TopicAdminClient;
import com.google.pubsub.v1.Topic;
import com.google.pubsub.v1.TopicName;
import java.io.IOException;

public class CreateTopicExample {
  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";

    createTopicExample(projectId, topicId);
  }

  public static void createTopicExample(String projectId, String topicId) throws IOException {
    try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
      TopicName topicName = TopicName.of(projectId, topicId);
      Topic topic = topicAdminClient.createTopic(topicName);
      System.out.println("Created topic: " + topic.getName());
    }
  }
}

Node.js

このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API リファレンス ドキュメントをご覧ください。

/**
 * TODO(developer): Uncomment this variable before running the sample.
 */
// const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';

// 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 createTopic(topicNameOrId) {
  // Creates a new topic
  await pubSubClient.createTopic(topicNameOrId);
  console.log(`Topic ${topicNameOrId} created.`);
}

Node.ts

このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API リファレンス ドキュメントをご覧ください。

/**
 * TODO(developer): Uncomment this variable before running the sample.
 */
// const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';

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

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

async function createTopic(topicNameOrId: string) {
  // Creates a new topic
  await pubSubClient.createTopic(topicNameOrId);
  console.log(`Topic ${topicNameOrId} created.`);
}

PHP

このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の PHP の設定手順を実施してください。詳細については、Pub/Sub PHP API リファレンス ドキュメントをご覧ください。

use Google\Cloud\PubSub\PubSubClient;

/**
 * Creates a Pub/Sub topic.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 */
function create_topic($projectId, $topicName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->createTopic($topicName);

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

Python

このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API のリファレンス ドキュメントをご覧ください。

from google.cloud import pubsub_v1

# TODO(developer)
# project_id = "your-project-id"
# topic_id = "your-topic-id"

publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(project_id, topic_id)

topic = publisher.create_topic(request={"name": topic_path})

print(f"Created topic: {topic.name}")

Ruby

次のサンプルでは、Ruby Pub/Sub クライアント ライブラリ v3 を使用しています。v2 ライブラリをまだ使用している場合は、 v3 への移行ガイドをご覧ください。Ruby v2 のコードサンプルの一覧については、 非推奨のコードサンプルをご覧ください。

このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。

# topic_id = "your-topic-id"

pubsub = Google::Cloud::PubSub.new
topic_admin = pubsub.topic_admin

topic = topic_admin.create_topic name: pubsub.topic_path(topic_id)

puts "Topic #{topic.name} created."

次のステップ

Apache Kafka® は、Apache Software Foundation または米国その他の諸国における関連会社の商標です。