Pub/Sub メッセージの作成とレスポンス

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。2020 年 2 月以降に作成されたアプリの場合、REGION_ID.r が App Engine の URL に含まれています。この日付より前に作成されたアプリの場合、URL のリージョン ID は省略可能です。

詳しくは、リージョン ID をご覧ください。

Pub/Sub は、信頼できる多対多の非同期メッセージングをアプリケーション間で行います。パブリッシャー アプリケーションはメッセージをトピックに送信し、その他のアプリケーションはそのトピックにサブスクライブしてメッセージを受信できます。

このドキュメントでは、Cloud クライアント ライブラリを使用して、.NET アプリで Pub/Sub メッセージを送受信する方法を説明します。

前提条件

サンプルアプリのクローン作成

サンプルアプリをローカルマシンにコピーし、pubsub ディレクトリに移動します。

git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples
cd dotnet-docs-samples/appengine/flexible/pubsub

トピックとサブスクリプションの作成

トピックとサブスクリプションを作成します。Pub/Sub サーバーがリクエストを送信するエンドポイントも指定します。

gcloud pubsub topics create YOUR_TOPIC
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION `
    --topic YOUR_TOPIC `
    --push-endpoint `
    https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/pubsub/push?token=YOUR_SECRET_TOKEN `
    --ack-deadline 10

環境変数の設定

appsettings.json ファイルを編集して、プロジェクト ID を設定します。

{
  "Pubsub": {
    "ProjectId": "your-project-id",
    "VerificationToken": "your-secret-token",
    "TopicId": "your-topic",
    "SubscriptionId": "your-subscription",
    "AuthSubscriptionId": "your-auth-subscription",
    "ServiceAccountEmail": "your-service-account-email"
  },

  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}

コードレビュー

サンプルアプリでは、Cloud クライアント ライブラリを使用しています。

[HttpGet]
[HttpPost]
public IActionResult Index(MessageForm messageForm)
{
    var model = new MessageList();
    if (!_options.HasGoodProjectId())
    {
        model.MissingProjectId = true;
        return View(model);
    }
    if (!string.IsNullOrEmpty(messageForm.Message))
    {
        // Publish the message.
        var pubsubMessage = new PubsubMessage()
        {
            Data = ByteString.CopyFromUtf8(messageForm.Message)
        };
        pubsubMessage.Attributes["token"] = _options.VerificationToken;
        _publisher.PublishAsync(pubsubMessage);
        model.PublishedMessage = messageForm.Message;
    }
    // Render the current list of messages.
    model.Messages = s_receivedMessages.ToArray();
    model.AuthMessages = s_authenticatedMessages.ToArray();
    return View(model);
}

サンプルのローカルでの実行

ローカルで実行する場合、Google Cloud CLI で Google Cloud APIs を使用するための認証を行うことができます。前提条件に記載されているとおりに環境をセットアップしていれば、この認証のための gcloud init コマンドはすでに実行されています。

サンプルアプリをローカルで実行するには:

Visual Studio

  1. Visual Studio で dotnet-docs-samples\appengine\flexible\AppEngineFlex.sln を開きます。

  2. ソリューション エクスプローラーで [Pubsub] を右クリックし、[Debug] > [Start new instance] の順に選択します。

コマンドライン

  1. dotnet-docs-samples\appengine\flexible\Pubsub ディレクトリから次のコマンドを実行します。

    dotnet restore
    dotnet run
    
  2. ウェブブラウザに次のアドレスを入力します。

    http://localhost:5000/
    

プッシュ通知をシミュレートする

アプリケーションは、ローカルでメッセージを送信できますが、push メッセージを受信することはできません。push メッセージをシミュレートするには、ローカルのプッシュ通知エンドポイントに HTTP リクエストを送信します。このサンプルには、sample_message.json というファイルが含まれています。

HTTP POST リクエストを送信するには、次のコマンドを実行します。

Get-Content -Raw .\sample_message.json | Invoke-WebRequest -Uri
http://localhost:5000/Push?token=your-secret-token -Method POST -ContentType
'text/json' -OutFile out.txt

リクエストの完了後、localhost:5000 を更新すると、受信メッセージのリストにメッセージが表示されます。

App Engine 上で実行する

gcloud コマンドライン ツールを使用してデモアプリを App Engine にデプロイするには、app.yaml ファイルが配置されているディレクトリから次のコマンドを実行します。

Visual Studio

Hello World アプリをデプロイするには:

  1. Visual Studio で dotnet-docs-samples\appengine\flexible\AppEngineFlex.sln を開きます。
  2. ソリューション エクスプローラで [Pubsub] を右クリックし、[Publish to Google Cloud...] を選択します。
  3. [App Engine Flex] をクリックします。
  4. [Publish] をクリックします。

コマンドライン

dotnet-docs-samples\appengine\flexible\Pubsub ディレクトリから次のコマンドを実行します。
dotnet restore
dotnet publish
cd bin\Debug\netcoreapp2.1\publish
gcloud app deploy

これで、https://PROJECT_ID.REGION_ID.r.appspot.com のアプリケーションにアクセスできます。フォームを使用してメッセージを送信できますが、アプリケーションのどのインスタンスが通知を受信するかはわかりません。複数のメッセージを送信してページを更新すると、受信メッセージを確認できます。