エミュレータを使用したローカルでのアプリのテスト

アプリケーションをローカルで開発してテストするには、Pub/Sub エミュレータを使用できます。これにより、本番環境の Pub/Sub サービスのローカル エミュレーションを可能にします。Pub/Sub エミュレータは、gcloud コマンドライン ツールを使用して実行します。

エミュレータに対してアプリケーションを実行するには、まずエミュレータを起動し、アプリケーションが本番環境の Pub/Sub サービスの代わりにエミュレータと通信するように環境変数を設定する必要があります。

要件

Pub/Sub エミュレータを使用するには、次のことが必要です。

  • 適切にセットアップされた Python 開発環境がある。詳細については、このガイドをご覧ください。

  • Java JRE(バージョン 7 以降)がインストールされている。

  • Google Cloud SDK がインストールされている。Cloud SDK には gcloud コマンドライン ツールが含まれています。

  • Google Cloud のクライアント ライブラリを使用してビルドされたアプリケーションがある。

エミュレータのインストール

コマンド プロンプトからエミュレータをインストールします。

gcloud components install pubsub-emulator
gcloud components update

エミュレータの開始

エミュレータを起動するには、コマンド プロンプトから pubsub start を実行します。コマンドを実行する前に、PUBSUB_PROJECT_ID を有効な Google Cloud プロジェクト ID 文字列に置き換えます。Pub/Sub エミュレータはローカルで実行されるため、文字列は実際の Google Cloud プロジェクトを表す必要はありません。

gcloud beta emulators pubsub start --project=PUBSUB_PROJECT_ID [options]

オプションの一覧は、gcloud beta emulators pubsub start をご覧ください。

エミュレータの起動後、次のようなメッセージが表示されます。

...
[pubsub] This is the Pub/Sub fake.
[pubsub] Implementation may be incomplete or differ from the real system.
...
[pubsub] INFO: Server started, listening on 8085

これは、Pub/Sub サーバーが、Google Cloud エンドポイントではなく、ローカルマシン上のエミュレータ エンドポイントで実行されていることを示します。次のものを含むすべてのオペレーションはローカルで行われます。

  • トピックまたはサブスクリプションの作成
  • パブリッシュ
  • サブスクライブ

環境変数の設定

エミュレータを起動した後、アプリケーションが Pub/Sub ではなくエミュレータに接続するように環境変数を設定する必要があります。これらの環境変数は、アプリケーションの実行に使用するマシンに設定します。

エミュレータを起動するたびに、環境変数を設定する必要があります。環境変数は、動的に割り当てられるポート番号に依存しています。この番号は、エミュレータを再起動するたびに変わる可能性があります。

変数の自動設定

アプリケーションとエミュレータが同じマシン上で動作している場合は、次のようにして環境変数を自動的に設定できます。

Linux / macOS

コマンド代入を使用して env-init を実行します。

$(gcloud beta emulators pubsub env-init)

Windows

env-init からの出力を使用してバッチファイルを作成、実行します。

gcloud beta emulators pubsub env-init > set_vars.cmd && set_vars.cmd

これで、アプリケーションが Pub/Sub エミュレータに接続します。

変数の手動設定

アプリケーションとエミュレータが別々のマシン上で動作している場合は、次のようにして環境変数を手動で設定します。

  1. env-init コマンドを実行します。

     gcloud beta emulators pubsub env-init

  2. アプリケーションを実行するマシンで、env-init コマンドの出力の指示に従って PUBSUB_EMULATOR_HOST 環境変数と値を設定します。エミュレータに使用するプロジェクトに PUBSUB_PROJECT_ID 環境変数を設定することもできますが、エミュレータに接続するアプリケーションには PUBSUB_EMULATOR_HOST を設定する必要があります。次に例を示します。

    Linux / macOS
    export PUBSUB_EMULATOR_HOST=localhost:8432
    export PUBSUB_PROJECT_ID=my-project-id
    Windows
    set PUBSUB_EMULATOR_HOST=localhost:8432
    set PUBSUB_PROJECT_ID=my-project-id

これで、アプリケーションが Pub/Sub エミュレータに接続します。

注: Python App Engine スタンダード ローカル開発サーバーを使用している場合には、次のように環境変数をコマンドラインに渡す必要があります。

Python

dev_appserver.py app.yaml --env_var PUBSUB_EMULATOR_HOST=${PUBSUB_EMULATOR_HOST}

エミュレータの使用

エミュレータを使用するには、Google Cloud クライアント ライブラリを使用してアプリケーションを構築する必要があります。エミュレータでは Cloud Console および gcloud pubsub コマンドはサポートされていません。

次の例では、エミュレータと Python Google Cloud クライアント ライブラリを使用するアプリケーションにより、トピックの作成、メッセージのパブリッシュと読み取りを行います、

エミュレータの環境変数を設定したマシンで、次の手順を行います。

  1. Python リポジトリ全体のクローンを作成することによって、GitHub から Pub/Sub Python のサンプルを取得します。Pub/Sub サンプルは pubsub ディレクトリにあります。

  2. クローン作成されたリポジトリで、pubsub/cloud-client ディレクトリに移動します。残りのステップをこのディレクトリで行います。

  3. サンプルの実行に必要な依存環境を pubsub/cloud-client ディレクトリからインストールします。

    pip install -r requirements.txt
    
  4. トピックを作成します。

     python publisher.py PUBSUB_PROJECT_ID create TOPIC_ID
    
  5. (省略可)エミュレータで push サブスクリプションをテストするためのローカル push エンドポイントがない場合は、次の手順で http://localhost:3000/messages に作成します。

    1. JSON サーバーをインストールします。
      npm install -g json-server
      
    2. JSON サーバーを開始します。
      json-server --port 3000 --watch db.json
      
      ここで、db.json には以下のスターター コードが含まれています。
      {
         "messages": []
      }
      
    3. 次のステップで PUSH_ENDPOINThttp://localhost:3000/messages を書き留めます。
  6. トピックへのサブスクリプションを作成します。

    • pull サブスクリプションを作成します。

      python subscriber.py PUBSUB_PROJECT_ID create TOPIC_ID SUBSCRIPTION_ID
      
    • push サブスクリプションを作成します。

      python subscriber.py PUBSUB_PROJECT_ID create-push TOPIC_ID SUBSCRIPTION_ID \
      PUSH_ENDPOINT
      
  7. トピックにメッセージをパブリッシュします。

     python publisher.py PUBSUB_PROJECT_ID publish TOPIC_ID
    
  8. トピックにパブリッシュされているメッセージを読み取ります。

    • pull サブスクリプションからメッセージを取得します。

      python subscriber.py PUBSUB_PROJECT_ID receive SUBSCRIPTION_ID
      
    • ローカル push エンドポイントに配信されたメッセージを確認します。たとえば、メッセージは次のようになります。

      {
        "messages": [
            {
                "subscription": "projects/PUBSUB_PROJECT_ID/subscriptions/SUBSCRIPTION_ID",
                "message": {
                    "data": "TWVzc2FnZSBudW1iZXIgMQ==",
                    "messageId": "10",
                    "attributes": {}
                },
                "id": 1
            },
            ...
        ]
      }
      

環境変数へのアクセス

Java と C# 以外の言語では、環境変数の設定で説明されているように PUBSUB_EMULATOR_HOST を設定すると、Pub/Sub クライアント ライブラリは、Pub/Sub ではなくローカル インスタンスで実行される API を自動的に呼び出します。

ただし C# と Java のクライアント ライブラリの場合には、エミュレータを使用するようにコードを変更する必要があります。

C#

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

// For example, "localhost:8615"
string emulatorHostAndPort = Environment.GetEnvironmentVariable("PUBSUB_EMULATOR_HOST");

PublisherServiceApiClient client = new PublisherServiceApiClientBuilder
{
    Endpoint = emulatorHostAndPort,
    ChannelCredentials = ChannelCredentials.Insecure
}.Build();
client.CreateTopic(new TopicName("project", "topic"));
foreach (var topic in client.ListTopics(new ProjectName("project")))
{
    Console.WriteLine(topic.Name);
}

Java

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

String hostport = System.getenv("PUBSUB_EMULATOR_HOST");
ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build();
try {
  TransportChannelProvider channelProvider =
      FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel));
  CredentialsProvider credentialsProvider = NoCredentialsProvider.create();

  // Set the channel and credentials provider when creating a `TopicAdminClient`.
  // Similarly for SubscriptionAdminClient
  TopicAdminClient topicClient =
      TopicAdminClient.create(
          TopicAdminSettings.newBuilder()
              .setTransportChannelProvider(channelProvider)
              .setCredentialsProvider(credentialsProvider)
              .build());

  TopicName topicName = TopicName.of("my-project-id", "my-topic-id");
  // Set the channel and credentials provider when creating a `Publisher`.
  // Similarly for Subscriber
  Publisher publisher =
      Publisher.newBuilder(topicName)
          .setChannelProvider(channelProvider)
          .setCredentialsProvider(credentialsProvider)
          .build();
} finally {
  channel.shutdown();
}

エミュレータの停止

エミュレータを停止するには、Ctrl+C キーを押します。

エミュレータを停止した後、次のコマンドを実行して PUBSUB_EMULATOR_HOST 環境変数を削除し、アプリケーションが Pub/Sub に接続するようにします。

Linux / macOS
unset PUBSUB_EMULATOR_HOST
Windows
set PUBSUB_EMULATOR_HOST=

エミュレータのコマンドライン引数

Cloud Pub/Sub エミュレータのコマンドライン引数の詳細については、gcloud beta emulators pubsub をご覧ください。

既知の制限事項

  • UpdateTopic RPC と UpdateSnapshot RPC は、現在サポートされていません。
  • IAM オペレーションは現在サポートされていません。
  • 構成可能なメッセージ保持はサポートされていません。すべてのメッセージが無期限に保持されます。
  • サブスクリプションの有効期限はサポートされていません。サブスクリプションの有効期限はありません。

問題を報告する場合には、Pub/Sub フォーラムをご利用ください。