このエントリは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への接続イベントを拾っていることを確認できる。
