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

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

エミュレータでアプリケーションを実行する前に、エミュレータの起動や環境変数の構成など、いくつかの設定を行う必要があります。

要件

Cloud Pub/Sub エミュレータを使用するには、以下が必要です。

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

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

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

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

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

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

gcloud components install pubsub-emulator
gcloud components update

エミュレータの開始

コマンド プロンプトから pubsub start を呼び出してエミュレータを起動します。

gcloud beta emulators pubsub start [options]

[options] は、gcloud コマンドライン ツールに指定されたコマンドライン引数です。オプションの詳細リストについては gcloud beta emulators pubsub start をご確認ください。

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

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

push サブスクリプションのテストを行うには、HTTP POST リクエストを処理できる有効なローカル push エンドポイントを使用します。たとえば、JSON サーバーを使用して http://localhost:3000 で架空の REST API サーバーを起動します。リソースとして http://localhost:3000/receive_messages を使用します。

環境変数の設定

エミュレータを起動したら、アプリケーションが 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

アプリケーションが Cloud 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

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

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

Python

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

エミュレータの使用

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

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

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

  1. GitHub から Cloud Pub/Sub Python サンプルを取得して、Python リポジトリレ全体のクローンを作成します。Cloud 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. トピックへのサブスクリプションを作成します。

    • pull サブスクリプションを作成します。
    python subscriber.py PUBSUB_PROJECT_ID create TOPIC_ID SUBSCRIPTION_ID
    
    • push サブスクリプションの場合は、ローカルサーバーでエンドポイントをリソースとして設定します。これは PUSH_ENDPOINT の有効な値になります(例: http://localhost:3000/receive_messages)。次に push サブスクリプションを作成します。
    python subscriber.py PUBSUB_PROJECT_ID create-push TOPIC_ID SUBSCRIPTION_ID
    PUSH_ENDPOINT
    
  6. トピックにメッセージを公開します。

    python publisher.py PUBSUB_PROJECT_ID publish TOPIC_ID
    
  7. トピックに公開されているメッセージを読み取ります。

    python subscriber.py PUBSUB_PROJECT_ID receive SUBSCRIPTION_ID
    

環境変数へのアクセス

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

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

C#

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

// Copyright 2017 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using Google.Apis.Logging;
using Google.Cloud.PubSub.V1;
using Google.Cloud.Translation.V2;
using static Google.Apis.Http.ConfigurableMessageHandler;
using Grpc.Core;
using System;
using Google.Api.Gax.ResourceNames;

namespace Google.Cloud.Tools.Snippets
{
    public class FaqSnippets
    {
        public void Emulator()
        {
            // Sample: Emulator
            // For example, "localhost:8615"
            string emulatorHostAndPort = Environment.GetEnvironmentVariable("PUBSUB_EMULATOR_HOST");

            Channel channel = new Channel(emulatorHostAndPort, ChannelCredentials.Insecure);
            PublisherServiceApiClient client = PublisherServiceApiClient.Create(channel);
            client.CreateTopic(new TopicName("project", "topic"));
            foreach (var topic in client.ListTopics(new ProjectName("project")))
            {
                Console.WriteLine(topic.Name);
            }
            // End sample
        }

        public void RestLogging()
        {
            // Sample: RestLogging
            // Required using directives:
            // using static Google.Apis.Http.ConfigurableMessageHandler;
            // using Google.Apis.Logging;
            // using Google.Cloud.Translation.V2;

            // Register a verbose console logger
            ApplicationContext.RegisterLogger(new ConsoleLogger(LogLevel.All));

            // Create a translation client
            TranslationClient client = TranslationClient.Create();

            // Configure which events the message handler will log.
            client.Service.HttpClient.MessageHandler.LogEvents =
                LogEventType.RequestHeaders | LogEventType.ResponseBody;

            // Make the request
            client.ListLanguages();
            // End sample
        }
    }
}

Java

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用の Java の設定手順に従ってください。詳細については、Cloud 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());

  ProjectTopicName topicName = ProjectTopicName.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();
}

エミュレータの停止

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

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

Linux / macOS
unset PUBSUB_EMULATOR_HOST
Windows
set PUBSUB_EMULATOR_HOST=

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

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

既知の制限

  • コードからパブリッシャーやサブクライバーを開始または停止することはできません。
  • IAM オペレーションは現在サポートされていません。

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

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Pub/Sub ドキュメント