Azure SignalR ServiceとEvent Gridを組み合わせる

このエントリは2019/08/14現在の情報に基づくもので、将来の機能追加・廃止によって、記載内容との乖離が発生する可能性があります。

以前、以下のエントリを記載した。

Azure SignalR Serviceを試す
https://logico-jp.io/2019/07/12/try-azure-signalr-service/

最近、Azure SignalR ServiceがEvent Gridと接続ができるようになった。これを使うとクライアントからのイベントを捕捉してEvent Gridへ送出し、イベントをサブスクライブしている別のサービスが対応できる。

Azure SignalR Service now supports Event Grid!
https://devblogs.microsoft.com/aspnet/azure-signalr-service-now-supports-event-grid/

上記エントリは例によってC#やJavaScriptのみなので、前記のエントリに追記する形で、Javaの例を記載しておく。

準備

Azure SignalR Service

インスタンスを作成する。これは以前のエントリに記載した通り。Settings > Feature Flag でServerlessを設定しておく(これはインスタンス作成時に設定することも可能)。

Functions

Event Grid TriggerのFunction Appを作成する。Javaの場合、ArcheTypeを使ってMavenでコードを生成する。

mvn archetype:generate \
-DarchetypeGroupId=com.microsoft.azure \
-DarchetypeArtifactId=azure-functions-archetype \
-DappName={resourceGroup} \
-DappRegion={region} \
-DresourceGroup={resourceGroup} \
-DgroupId=com.{functionAppName}.group \
-DartifactId={functionAppName}-functions \
-Dpackage=com.{functionAppName} \
-DinteractiveMode=false

Azure SignalR ServiceをFunctionsで操作する場合、pom.xmlに依存関係を追加する必要がある。

<dependency>
    <groupId>com.microsoft.signalr</groupId>
    <artifactId>signalr</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>com.microsoft.azure.functions</groupId>
    <artifactId>azure-functions-java-library-signalr</artifactId>
    <version>1.0.0</version>
</dependency>

同様に、Event Gridを操作する場合には、以下の依存関係を追加する必要がある。

<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-eventgrid</artifactId>
    <version>1.2.0</version>
</dependency>

Azure SignalR Serviceの接続文字列は、構成 > アプリケーション設定 で設定する。この例では名前をAzureSignalRConnectionString としている。設定後、Javaのコードを生成したディレクトリ配下(pom.xmlのあるディレクトリ)で、以下のコマンドを実行してローカル環境でもテストできるよう、local.settings.jsonを作成しておく。必要であれば、local.setteings.jsonにCORSの設定をいれる。以下はCORS設定を入れた例。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "...",
    "FUNCTIONS_WORKER_RUNTIME": "java",
    "APPINSIGHTS_INSTRUMENTATIONKEY": "...",
    "AzureSignalRConnectionString": "Endpoint=https://...Version=1.0;",
    "FUNCTIONS_EXTENSION_VERSION": "~2",
    "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "DefaultEndpointsProtocol=https;AccountName=...",
    "WEBSITE_CONTENTSHARE": "...",
    "WEBSITE_NODE_DEFAULT_VERSION": "10.14.1"
  },
  "ConnectionStrings": {
    "AzureCosmosDBConnection": {
      "ConnectionString": "..."
    }
  },
  "Host": {
    "CORS": "*"
  }
}

続いて、以前のAzure SingnalR Serviceを試したときの例にEvent Grid用のFunctionを追加する。Event Gridへのバインドを設定したFunctionは以下の通り。

    @FunctionName("eventGridMonitor")
    public void logEvent(
            @EventGridTrigger(name = "event") String event,
            final ExecutionContext context) {
        // log
        context.getLogger().info("Event content: " + event);
    }

作成したらデプロイしておく。

Event Grid

大枠は以下のドキュメントに記載の通りなので、記載内容に従って作業を行うが、今回はFunctionsを使うため、少々異なる点は意識しておく必要がある。

イベントを Azure SignalR Service から Event Grid に送信する方法 / How to send events from Azure SignalR Service to Event Grid
https://docs.microsoft.com/azure/azure-signalr/signalr-howto-event-grid-integration

初めてEvent Gridを使う場合、以下のドキュメントに記載の通り、Event Grid リソース プロバイダーを有効化しておく。

Event Grid リソース プロバイダーを有効にする / Enable Event Grid Resource Provider
https://docs.microsoft.com/azure/azure-signalr/signalr-howto-event-grid-integration#enable-event-grid-resource-provider

イベントサブスクリプション作成は、Azure SignalR Service > イベント で実施する(元のエントリではFunction Appの設定から実施しているが、Javaで作成するFunctionの場合、Function Appの設定はRead onlyになるため設定を反映できない)。今回、Event GridをサブスクライブするFunctionとしてeventGridMonitorというFunctionを作成、デプロイ済みなので、このタイミングでEvent Gridとの紐付けを行う。赤で囲んだwebhookをクリックする。

Azure SignalR Serviceへの接続、切断イベントのフィルタリングや、リソース指定は自動設定されているが、エンドポイントの詳細は設定する必要がある。ここでは webhook を指定し、サブスクライバーエンドポイントはEvent Gridバインドを設定したFunctionの 統合 > Event GridのサブスクリプションURL (下図) をコピーし、Event Gridのエンドポイントに転記する(下図)。

設定が完了したら、 [作成] をクリック。

以上で終了。

イベントの確認

以前のエントリで作成したクライアントを使って接続・切断を実施する。イベントを拾えているかどうかを確認するため、ログストリーミングを使う。Function App > プラットフォーム機能 > ログストリーミング をクリックして、[アプリケーション ログ] を表示しておく。

クライアントからの接続・切断をしてみると、以下のようなログが現れた。Azure SignalR Serviceへの接続イベントを拾っていることを確認できる。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中