イベントを Azure SignalR Service から Event Grid に送信する方法
Azure Event Grid は、pub-sub モデルを使用した画一的なイベント使用を提供する、完全に管理されたイベント ルーティング サービスです。 このガイドでは、Azure CLI を使用して Azure SignalR Service を作成し、接続イベントをサブスクライブして、イベントを受信するサンプル Web アプリケーションをデプロイします。 最後に、接続および接続解除し、サンプル アプリケーションでイベントのペイロードを確認します。
Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。
前提条件
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。
CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。
初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。
az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
- この記事の Azure CLI コマンドは、Bash シェル用にフォーマットされています。 PowerShell、コマンド プロンプトなど、別のシェルを使用している場合は、必要に応じて、行連結文字または変数代入行を適切に調整する必要があります。 この記事では変数を使用して、必要なコマンド編集を最小限に抑えています。
重要
この記事に示す生の接続文字列は、デモンストレーションのみを目的としています。
接続文字列には、アプリケーションが Azure Web PubSub サービスにアクセスするために必要な認可情報が含まれています。 接続文字列内のアクセス キーは、サービスのルート パスワードに似ています。 運用環境では、常にアクセス キーを保護してください。 Azure Key Vault を使用してキーの管理とローテーションを安全に行い、Microsoft Entra ID を使用して接続文字列をセキュリティで保護し、Microsoft Entra ID を使用してアクセスを認可します。
アクセス キーを他のユーザーに配布したり、ハードコーディングしたり、他のユーザーがアクセスできるプレーンテキストで保存したりしないでください。 キーが侵害された可能性があると思われる場合は、キーをローテーションしてください。
リソース グループを作成する
Azure リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。 az group create コマンドでは、myResourceGroup という名前のリソース グループが eastus リージョンに作成されます。 ご自身のリソース グループに別の名前を使用する場合は、RESOURCE_GROUP_NAME
を別の値に設定してください。
RESOURCE_GROUP_NAME=myResourceGroup
az group create --name $RESOURCE_GROUP_NAME --location eastus
SignalR Service の作成
次に、以下のコマンドを使用して、Azure SignalR Service をリソース グループにデプロイします。
SIGNALR_NAME=SignalRTestSvc
az signalr create --resource-group $RESOURCE_GROUP_NAME --name $SIGNALR_NAME --sku Free_F1
SignalR Service が作成されると、Azure CLI により次の例のような出力が返されます。
{
"externalIp": "13.76.156.152",
"hostName": "clitest.servicedev.signalr.net",
"hostNamePrefix": "clitest",
"id": "/subscriptions/28cf13e2-c598-4aa9-b8c8-098441f0827a/resourceGroups/clitest1/providers/Microsoft.SignalRService/SignalR/clitest",
"location": "southeastasia",
"name": "clitest",
"provisioningState": "Succeeded",
"publicPort": 443,
"resourceGroup": "clitest1",
"serverPort": 443,
"sku": {
"capacity": 1,
"family": null,
"name": "Free_F1",
"size": "F1",
"tier": "Free"
},
"tags": null,
"type": "Microsoft.SignalRService/SignalR",
"version": "1.0"
}
イベント エンドポイントの作成
このセクションでは、GitHub リポジトリにある Resource Manager テンプレートを使用して、構築済みサンプル Web アプリケーションを Azure App Service にデプロイします。 その後、レジストリの Event Grid イベントをサブスクライブし、このアプリを、イベントの送信先エンドポイントとして指定します。
サンプル アプリをデプロイするには、SITE_NAME
をご自身の Web アプリの一意の名前に設定し、次のコマンドを実行します。 サイト名は Web アプリの完全修飾ドメイン名 (FQDN) の一部であるため、Azure 内で一意にする必要があります。 後のセクションで、Web ブラウザーを使用してアプリの FQDN に移動し、ご自身のレジストリのイベントを表示します。
SITE_NAME=<your-site-name>
az deployment group create \
--resource-group $RESOURCE_GROUP_NAME \
--template-uri "https://raw.githubusercontent.com/Azure-Samples/azure-event-grid-viewer/master/azuredeploy.json" \
--parameters siteName=$SITE_NAME hostingPlanName=$SITE_NAME-plan
デプロイが成功したら (数分をかかる場合があります)、ブラウザーを開いて Web アプリに移動し、実行中であることを確認します。
http://<your-site-name>.azurewebsites.net
Event Grid リソース プロバイダーを有効にする
Azure サブスクリプションで Event Grid を使用したことがない場合は、Event Grid リソース プロバイダーを登録する必要がある可能性があります。 以下のプロバイダーを登録するコマンドを実行します。
az provider register --namespace Microsoft.EventGrid
登録完了まで少し時間がかかることがあります。 状態を確認するには、次のコマンドを実行します。
az provider show --namespace Microsoft.EventGrid --query "registrationState"
registrationState
がRegistered
になったら、次に進めることができます。
レジストリ イベントのサブスクライブ
Event Grid では、"トピック" をサブスクライブすることで、どのイベントを追跡し、どこにイベントを送信するかをその Event Grid に伝えます。 コマンド az eventgrid event-subscription create
は、作成した Azure SignalR Service をサブスクライブし、イベントを送信するエンドポイントとして Web アプリの URL を指定します。 前のセクションで設定した環境変数はここで再利用されます。したがって、編集は不要です。
SIGNALR_SERVICE_ID=$(az signalr show --resource-group $RESOURCE_GROUP_NAME --name $SIGNALR_NAME --query id --output tsv)
APP_ENDPOINT=https://$SITE_NAME.azurewebsites.net/api/updates
az eventgrid event-subscription create \
--name event-sub-signalr \
--source-resource-id $SIGNALR_SERVICE_ID \
--endpoint $APP_ENDPOINT
サブスクリプションが完了すると、次の例のような出力が表示されます。
{
"deadLetterDestination": null,
"destination": {
"endpointBaseUrl": "https://$SITE_NAME.azurewebsites.net/api/updates",
"endpointType": "WebHook",
"endpointUrl": null
},
"filter": {
"includedEventTypes": [
"Microsoft.SignalRService.ClientConnectionConnected",
"Microsoft.SignalRService.ClientConnectionDisconnected"
],
"isSubjectCaseSensitive": null,
"subjectBeginsWith": "",
"subjectEndsWith": ""
},
"id": "/subscriptions/28cf13e2-c598-4aa9-b8c8-098441f0827a/resourceGroups/myResourceGroup/providers/Microsoft.SignalRService/SignalR/SignalRTestSvc/providers/Microsoft.EventGrid/eventSubscriptions/event-sub-signalr",
"labels": null,
"name": "event-sub-signalr",
"provisioningState": "Succeeded",
"resourceGroup": "myResourceGroup",
"retryPolicy": {
"eventTimeToLiveInMinutes": 1440,
"maxDeliveryAttempts": 30
},
"topic": "/subscriptions/28cf13e2-c598-4aa9-b8c8-098441f0827a/resourceGroups/myResourceGroup/providers/microsoft.signalrservice/signalr/SignalRTestSvc",
"type": "Microsoft.EventGrid/eventSubscriptions"
}
レジストリ イベントのトリガー
サービス モードを Serverless Mode
に切り替え、SignalR Service へのクライアント接続をセットアップします。 サーバーレス サンプルを参考にすることができます。
この記事では、デモの目的でのみ、この生の接続文字列を表示しています。 運用環境では、常にアクセス キーを保護してください。 Azure Key Vault を使用してキーの管理とローテーションを安全に行い、Microsoft Entra ID を使用して接続文字列をセキュリティで保護し、Microsoft Entra ID を使用してアクセスを認可します。
git clone git@github.com:aspnet/AzureSignalR-samples.git
cd samples/Management
# Start the negotiation server
# Negotiation server is responsible for generating access token for clients
cd NegotiationServer
dotnet user-secrets set Azure:SignalR:ConnectionString "<Connection String>"
dotnet run
# Use a separate command line
# Start a client
cd SignalRClient
dotnet run
レジストリ イベントの表示
クライアントを SignalR Service に接続できました。 Event Grid ビューアー Web アプリに移動すると、ClientConnectionConnected
イベントが表示されています。 クライアントを終了すると、ClientConnectionDisconnected
イベントも表示されます。