トピックの作成

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 トピックに追加します。トピックの別のサブスクリプションは、そのトピックの作成後に作成できます。デフォルトのサブスクリプションには、次のプロパティがあります。

    • -sub のサブスクリプション ID
    • pull 配信タイプ
    • メッセージ保持期間(7 日間)
    • 非アクティブな状態が 31 日間までの有効期間
    • 確認応答の期限(10 秒)
    • 即時再試行ポリシー
  • Schema. スキーマとは、メッセージ データ フィールドが従わなければならない形式のことです。スキーマは、Pub/Sub が適用するパブリッシャーとサブスクライバー間の契約です。トピック スキーマを使用すると、メッセージ タイプと権限を標準化して、組織内のさまざまなチームが利用できるようになります。Pub/Sub は、メッセージ タイプと権限を監視する中央機関を作成します。スキーマを使用してトピックを作成するには、スキーマの概要をご覧ください。
  • 取り込みを有効にします。 このプロパティを有効にすると、外部ソースからトピックにストリーミング データを取り込んで、Google Cloud の機能を利用できるようになります。取り込み用のインポート トピックを作成するには、インポート トピックを作成するをご覧ください。

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

    • デフォルト = 無効
    • 最小値: 10 分。
    • 最大値: 31 日
  • 顧客管理の暗号鍵(CMEK)を使用するトピックが 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. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  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 リージョン内のメッセージ ストレージを制限できます。トピックの作成エラーを回避するには、トピックを作成する前に、必要に応じて組織のポリシーを調べて更新します。

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

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

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

    次のステップ