トピックの作成

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

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

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

始める前に

トピックの管理に必要なロールと権限

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

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

必要な権限

トピックの作成と管理には、次の権限が必要です。

  • トピックを作成する: pubsub.topics.create
  • トピックを削除する: pubsub.topics.delete
  • トピックからサブスクリプションの接続を解除する: pubsub.topics.detachSubscription
  • トピックを取得する: pubsub.topics.get
  • トピックを一覧表示する: pubsub.topics.list
  • トピックに公開する: pubsub.topics.publish
  • トピックを更新する: pubsub.topics.update
  • トピックの IAM ポリシーを取得する: pubsub.topics.getIamPolicy
  • トピックの IAM ポリシーを構成する: pubsub.topics.setIamPolicy

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

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

トピックのプロパティ

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

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

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

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

スキーマを使用する

スキーマとは、メッセージ データ フィールドが従わなければならない形式のことです。スキーマは、Pub/Sub が適用するパブリッシャーとサブスクライバー間の契約です。トピック スキーマを使用すると、メッセージ タイプと権限を標準化して、組織内のさまざまなチームが利用できるようになります。Pub/Sub は、メッセージ タイプと権限の中央機関を作成します。スキーマを使用してトピックを作成するには、スキーマの概要をご覧ください。

取り込みを有効にする

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

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

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

  • デフォルト = 有効になっていない
  • 最小値: 10 分。
  • 最大値: 31 日

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

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

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

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

Google が管理する暗号鍵

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

Cloud KMS 鍵

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

トピックの作成

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

Console

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

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

    トピックに移動

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

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

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

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

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

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. トピックを作成するには、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++

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

    Pub/Sub に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

    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#

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

    Pub/Sub に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

    
    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

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

    Pub/Sub に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/pubsub"
    )
    
    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()
    
    	t, err := client.CreateTopic(ctx, topicID)
    	if err != nil {
    		return fmt.Errorf("CreateTopic: %w", err)
    	}
    	fmt.Fprintf(w, "Topic created: %v\n", t)
    	return nil
    }
    

    Java

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

    Pub/Sub に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

    
    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

    /**
     * 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.js

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

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

    Pub/Sub に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

    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

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

    Pub/Sub に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

    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

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

    Pub/Sub に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

    # topic_id = "your-topic-id"
    
    pubsub = Google::Cloud::Pubsub.new
    
    topic = pubsub.create_topic topic_id
    
    puts "Topic #{topic.name} created."

    組織ポリシーの制約

    組織のポリシーでトピックの作成を制限できます。たとえば、ポリシーで Compute Engine リージョン内のメッセージ ストレージを制限できます。トピック作成エラーを回避するには、トピックを作成する前に、組織のポリシーを調べて必要に応じて更新します。

    プロジェクトを新しく作成した場合は、組織のポリシーが初期化されるまで数分待ってからトピックを作成します。

    [組織のポリシー] に移動

    詳細については、メッセージ ストレージ ポリシーを構成するをご覧ください。

    次のステップ