この記事では、サーバーレスの Socket.IO を使用した Azure Functions との統合について説明します。
アクション | バインドの種類 |
---|---|
URL とアクセス トークンを含むクライアント ネゴシエートの結果を取得する | 入力バインド |
サービスからメッセージによってトリガーする | トリガー バインド |
サービスを呼び出してメッセージを送信するかクライアントを管理する | 出力バインド |
ソース コード | パッケージ | API リファレンス ドキュメント | 製品ドキュメント | サンプル
重要
Azure 関数のバインドは、サーバーレス モードの Web PubSub for Socket.IO とのみ統合できます。
認証と接続文字列
拡張機能が Web PubSub for Socket.IO で動作できるようにするには、サービスで認証するためのアクセス キー ベースまたは ID ベースの構成を指定する必要があります。
アクセス キー ベースの構成
構成名 | 説明 |
---|---|
WebPubSubForSocketIOConnectionString | 必須。 サービスへのキー ベースの接続文字列 |
接続文字列は、Azure portal の Web PubSub for Socket.IO の [キー] ブレードにあります。
ローカル開発の場合は、local.settings.json
ファイルを使用して接続情報を保存します。
WebPubSubForSocketIOConnectionString
を、前の手順でコピーした接続文字列に設定します。
{
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
`WebPubSubForSocketIOConnectionString`: "Endpoint=https://<webpubsub-name>.webpubsub.azure.com;AccessKey=<access-key>;Version=1.0;"
}
}
デプロイ時に、アプリケーション設定を使用して接続文字列を設定します。
ID ベースの構成
構成名 | 説明 |
---|---|
WebPubSubForSocketIOConnectionString__endpoint | 必須。 サービスのエンドポイント。 たとえば、https://mysocketio.webpubsub.azure.com のように指定します。 |
WebPubSubForSocketIOConnectionString__credential | 接続のためにトークンを取得する方法を定義します。 デプロイされた Azure Function でマネージド ID 認証を使用する場合は、この設定を managedidentity に設定する必要があります。 この値は、ホスティング環境でマネージド ID が使用できる場合にのみ有効です。 |
WebPubSubForSocketIOConnectionString__clientId |
credential が managedidentity に設定されると、このプロパティによって、トークン取得時に使用されるユーザー割り当て ID を指定できます。 このプロパティは、アプリケーションに割り当てられたユーザー割り当て ID に相当するクライアント ID を受け取ります。 指定されていない場合、システム割り当て ID が使用されます。 |
関数バインドは、ID ベースの構成の共通プロパティに従います。 言及されていないプロパティの詳細については、「ID ベースの接続に共通のプロパティ」を参照してください。
ローカル開発の場合は、local.settings.json
ファイルを使用して接続情報を保存します。
WebPubSubForSocketIOConnectionString
を、前の手順でコピーした接続文字列に設定します。
{
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"WebPubSubForSocketIOConnectionString__endpoint": "https://<webpubsub-name>.webpubsub.azure.com",
"WebPubSubForSocketIOConnectionString__tenant": "<tenant id you're in>",
}
}
ID ベースの構成を使用してオンラインで実行する場合、AzureWebJobsStorage
では「ID を使用してホスト ストレージに接続する」を参照する必要があります。
入力バインディング
Socket.IO 入力バインドによって、クライアント ネゴシエーション要求に対する SocketIONegotiationResult
が生成されます。 サービスに接続しようとしている Socket.IO クライアントには、認証のために endpoint
、path
、および access token
を認識させる必要があります。 一般的な方法は、これらのデータを生成するサーバーを使用することであり、これはネゴシエーションと呼ばれます。
[FunctionName("SocketIONegotiate")]
public static IActionResult Negotiate(
[HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req,
[SocketIONegotiation(Hub = "hub", UserId = "userId")] SocketIONegotiationResult result)
{
return new OkObjectResult(result);
}
Attribute
入力バインドの属性は [SocketIONegotiation]
です。
属性のプロパティ | 説明 |
---|---|
ハブ | クライアントが接続する必要があるハブ名。 |
つながり | Socket.IO 接続文字列が含まれているアプリ設定の名前 (既定値は WebPubSubForSocketIOConnectionString )。 |
UserId | 接続の userId。 接続内のすべてのソケットに適用されます。 生成されたトークンの sub 要求になります。 |
トリガー バインド
Azure 関数ではトリガー バインドを使用して、Web PubSub for Socket.IO からのイベントを処理する関数をトリガーします。
トリガー バインドでは、Azure 関数エンドポイントに続く特定のパスを公開します。 URL は、サービスの URL テンプレートとして設定する必要があります (ポータル: 設定 -> イベント ハンドラー -> URL テンプレート)。 エンドポイント パターンでは、セキュリティ上の理由で、Azure 関数アプリを使用している場合は、クエリ部分 code=<API_KEY>
が必須です。 このキーは Azure portal で確認できます。 関数アプリを Azure にデプロイした後に、関数アプリ リソースを見つけて、[関数] ->[アプリ キー] ->[システム キー] ->[socketio_extension] の順に移動します。 ただし、ローカル関数を使用する場合、このキーは必要ありません。
<Function_App_Endpoint>/runtime/webhooks/socketio?code=<API_KEY>
ソケット接続イベントの関数トリガー。
[FunctionName("SocketIOTriggerConnect")]
public static async Task<SocketIOEventHandlerResponse> Connect(
[SocketIOTrigger("hub", "connect")] SocketIOConnectRequest request)
{
return new SocketIOConnectResponse();
}
ソケット接続済みイベントの関数トリガー。
[FunctionName("SocketIOTriggerConnected")]
public static async Task Connected(
[SocketIOTrigger("hub", "connected")] SocketIOConnectedRequest request)
{
}
ソケット切断イベントの関数トリガー。
[FunctionName("SocketIOTriggerDisconnected")]
public static async Task Disconnected(
[SocketIOTrigger("hub", "disconnected")] SocketIODisconnectedRequest request)
{
}
クライアントからの通常のメッセージの関数トリガー。
[FunctionName("SocketIOTriggerMessage")]
public static async Task NewMessage(
[SocketIOTrigger("hub", "new message")] SocketIOMessageRequest request,
[SocketIOParameter] string arg)
{
}
属性
トリガー バインドの属性は [SocketIOTrigger]
です。
属性のプロパティ | 説明 |
---|---|
ハブ | クライアントが接続する必要があるハブ名。 |
名前空間 | ソケットの名前空間。 既定値: "/" |
EventName | 関数がトリガーするイベント名。 一部のイベント名は次のように事前に定義されています: ソケット接続イベントの場合は connect 。 ソケット接続済みイベントの場合は connected 。 ソケット切断済みイベントの場合は disconnected 。 また、他のイベントはユーザーによって定義されます。これは、クライアント側によって送信されるイベント名と一致する必要があります。 |
ParameterNames | イベントのパラメーター名リスト。 リストの長さは、クライアントによって送信されるイベントと一致している必要があります。 また、この名前はバインド式と、same-name 関数パラメーターによるアクセスを使用しています。 |
バインド データ
[SocketIOTrigger]
は、一部の変数をバインド データにバインドします。 詳細については、「Azure Functions のバインド式のパターン」を参照してください
SocketIOAttribute
SocketIOAttribute
は ParameterNames
のオルタナティヴであり、関数の定義を簡略化します。 たとえば、次の 2 つの定義の効果は同じです。
[FunctionName("SocketIOTriggerMessage")]
public static async Task NewMessage(
[SocketIOTrigger("hub", "new message")] SocketIOMessageRequest request,
[SocketIOParameter] string arg)
{
}
[FunctionName("SocketIOTriggerMessage")]
public static async Task NewMessage(
[SocketIOTrigger("hub", "new message", ParameterNames = new[] {"arg"})] SocketIOMessageRequest request,
string arg)
{
}
ParameterNames
と [SocketIOParameter]
は同時に使用できないことに注意してください。
入力バインドの要求
入力バインド引数のデータ構造は、メッセージの種類によって異なります。
のインスタンスに接続するときには、
{
"namespace": "",
"socketId": "",
"claims": {
"<claim-type>": [ "<claim-value>" ]
},
"query": {
"<query-key>": [ "<query-value>" ]
},
"headers":{
"<header-name>": [ "<header-value>" ]
},
"clientCertificates":{
{
"thumbprint": "",
"content": ""
}
}
}
プロパティ | 説明 |
---|---|
namespace | ソケットの名前空間。 |
socketId | ソケットの一意の ID。 |
claims | クライアント接続の JWT の要求。 これはサービスが関数を要求するときの JWT ではなく、Engine.IO クライアントがサービスに接続するときの JWT であることに注意してください。 |
クエリ | クライアント接続のクエリ。 これはサービスが関数を要求するときのクエリではなく、Engine.IO クライアントがサービスに接続するときのクエリであることに注意してください。 |
headers | クライアント接続のヘッダー。 これはサービスが関数を要求するときのヘッダーではなく、Engine.IO クライアントがサービスに接続するときのヘッダーであることに注意してください。 |
clientCertificates | クライアント証明書 (有効になっている場合) |
接続済み
{
"namespace": "",
"socketId": "",
}
プロパティ | 説明 |
---|---|
namespace | ソケットの名前空間。 |
socketId | ソケットの一意の ID。 |
[Disconnected](切断済み)
{
"namespace": "",
"socketId": "",
"reason": ""
}
プロパティ | 説明 |
---|---|
namespace | ソケットの名前空間。 |
socketId | ソケットの一意の ID。 |
reason | 接続を閉じる理由の説明。 |
通常のイベント
{
"namespace": "",
"socketId": "",
"payload": "",
"eventName": "",
"parameters": []
}
プロパティ | 説明 |
---|---|
namespace | ソケットの名前空間。 |
socketId | ソケットの一意の ID。 |
ペイロード | Engine.IO プロトコルのメッセージ ペイロード |
eventName | 要求のイベント名。 |
parameters | メッセージのパラメーターのリスト。 |
出力バインディング
出力バインドでは現在、次の機能がサポートされています。
- ソケットをルームに追加する
- ソケットをルームから削除する
- メッセージをソケットに送信する
- メッセージをルームに送信する
- メッセージを名前空間に送信する
- ソケットを切断する
[FunctionName("SocketIOOutput")]
public static async Task<IActionResult> SocketIOOutput(
[SocketIOTrigger("hub", "new message")] SocketIOMessageRequest request,
[SocketIO(Hub = "hub")] IAsyncCollector<SocketIOAction> collector)
{
await collector.AddAsync(SocketIOAction.CreateSendToNamespaceAction("new message", new[] { "arguments" }));
}
Attribute
入力バインドの属性は [SocketIO]
です。
属性のプロパティ | 説明 |
---|---|
ハブ | クライアントが接続する必要があるハブ名。 |
つながり | Socket.IO 接続文字列が含まれているアプリ設定の名前 (既定値は WebPubSubForSocketIOConnectionString )。 |
アクション
出力バインドでは、アクションを使用して操作を実行します。 現在、次のアクションがサポートされています。
AddSocketToRoomAction
{
"type": "AddSocketToRoom",
"socketId": "",
"room": ""
}
RemoveSocketFromRoomAction
{
"type": "RemoveSocketFromRoom",
"socketId": "",
"room": ""
}
SendToNamespaceAction
{
"type": "SendToNamespace",
"eventName": "",
"parameters": [],
"exceptRooms": []
}
SendToRoomsAction
{
"type": "SendToRoom",
"eventName": "",
"parameters": [],
"rooms": [],
"exceptRooms": []
}
SendToSocketAction
{
"type": "SendToSocket",
"eventName": "",
"parameters": [],
"socketId": ""
}
DisconnectSocketsAction
{
"type": "DisconnectSockets",
"rooms": [],
"closeUnderlyingConnection": false
}