Azure Functions での Azure Web PubSub のトリガーとバインド

このリファレンスでは、Azure Functions で Web PubSub イベントを処理する方法について説明します。

Web PubSub は、開発者がリアルタイムの機能と発行-サブスクライブ パターンを使用して Web アプリケーションを簡単に構築するために役立つ Azure マネージド サービスです。

アクション Type
サービスからメッセージを受信したときに関数を実行する トリガー バインド
ネゴシエーション要求とアップストリーム要求の HTTP トリガーでターゲット オブジェクトに要求をバインドする 入力バインド
サービスを呼び出してアクションを実行する 出力バインド

ソース コード | パッケージ | API リファレンス ドキュメント | 製品ドキュメント | サンプル

Functions アプリに追加する

トリガーとバインドを使用するには、適切なパッケージを参照する必要があります。 NuGet パッケージは .NET クラス ライブラリに使用されますが、他のすべてのアプリケーションの種類には拡張バンドルが使用されます。

Language 追加手段 解説
C# NuGet パッケージ バージョン プレリリースをインストールする
C# スクリプト、JavaScript、Python、PowerShell 拡張機能を明示的にインストールする拡張機能バンドルを使用する Visual Studio Code で使用するには Azure Tools 拡張機能をお勧めします。
C# スクリプト (Azure portal ではオンラインのみ) バインディングを追加する 関数アプリを再発行せずにポータルで既存のバインディング拡張機能を更新するには、拡張機能の更新に関する記事を参照してください。

重要な概念

Diagram showing the workflow of Azure Web PubSub service working with Function Apps.

(1)-(2) クライアント接続を生成する HttpTrigger を使用した WebPubSubConnection 入力バインド。

(3)-(4) サービス要求を処理する WebPubSubTrigger トリガー バインドまたは HttpTrigger を使用した WebPubSubContext 入力バインド。

(5)-(6) サービスに何らかの実行を要求する WebPubSub 出力バインド。

トリガー バインド

関数トリガーを使用して、Azure Web PubSub サービスからの要求を処理します。

WebPubSubTrigger は、サービス側からの要求を処理する必要がある場合に使用します。 トリガー エンドポイント パターンは次のようになります。これは、Web PubSub サービス側で設定する必要があります (ポータル: 設定 -> イベント ハンドラー -> URL テンプレート)。 エンドポイント パターンでは、セキュリティ上の理由で、Azure 関数アプリを使用している場合は、クエリ部分 code=<API_KEY>必須です。 このキーは Azure portal で確認できます。 関数アプリを Azure にデプロイした後に、関数アプリ リソースを見つけて、[関数] ->[アプリ キー] ->[システム キー] ->[webpubsub_extension] の順に移動します。 ただし、ローカル関数を使用する場合、このキーは必要ありません。

<Function_App_Url>/runtime/webhooks/webpubsub?code=<API_KEY>

Screenshot of get function system keys.

[FunctionName("WebPubSubTrigger")]
public static void Run(
    [WebPubSubTrigger("<hub>", WebPubSubEventType.User, "message")] UserEventRequest request, ILogger log)
{
    log.LogInformation($"Request from: {request.ConnectionContext.UserId}");
    log.LogInformation($"Request message data: {request.Data}");
    log.LogInformation($"Request message dataType: {request.DataType}");
}

WebPubSubTrigger バインドでは、同期シナリオの戻り値もサポートされています。たとえば、サーバーがクライアント要求を確認して拒否できる場合や、呼び出し元に直接メッセージを送信できる場合の、システム Connect イベントやユーザー イベントなどです。 Connect現在のConnectEventResponseシナリオとEventErrorResponseUserEventResponseEventErrorResponse一致しない rest 型は無視されます。 また、返された場合 EventErrorResponse 、サービスはクライアント接続を切断します。

[FunctionName("WebPubSubTriggerReturnValueFunction")]
public static UserEventResponse Run(
    [WebPubSubTrigger("hub", WebPubSubEventType.User, "message")] UserEventRequest request)
{
    return request.CreateResponse(BinaryData.FromString("ack"), WebPubSubDataType.Text);
}

属性と注釈

C# クラス ライブラリでは、WebPubSubTrigger 属性を使用します。

メソッド シグネチャでの WebPubSubTrigger 属性を次に示します。

[FunctionName("WebPubSubTrigger")]
public static void Run([WebPubSubTrigger("<hub>", <WebPubSubEventType>, "<event-name>")] 
    WebPubSubConnectionContext context, ILogger log)
{
    ...
}

完全な例については、C# の例を参照してください。

構成

次の表は、function.json ファイルで設定したバインド構成のプロパティを説明しています。

function.json のプロパティ 属性のプロパティ 説明
type 該当なし 必須 - webPubSubTrigger に設定する必要があります。
direction 該当なし 必須 - in に設定する必要があります。
name 該当なし 必須 - イベント データを受信するパラメーターの、関数コードで使われている変数名。
hub ハブ 必須 - この値は、トリガーされる関数の Web PubSub ハブの名前に設定する必要があります。 高い優先順位として属性への値の設定をサポートしていますが、またはグローバル値としてアプリ設定に設定することもできます。
eventType WebPubSubEventType 必須 - この値は、トリガーされる関数のメッセージのイベントの種類として設定する必要があります。 値は、user または system である必要があります。
eventName EventName 必須 - この値は、トリガーされる関数のメッセージのイベントとして設定する必要があります。
system イベントの種類の場合、イベント名は connectconnecteddisconnected である必要があります。
ユーザー定義のサブプロトコルの場合、イベント名は message です。
システムでサポートされているサブプロトコル json.webpubsub.azure.v1. の場合、イベント名はユーザー定義のイベント名です。
connection つながり 省略可能 - アップストリームの Azure Web PubSub サービスを指定するアプリ設定または設定コレクションの名前。 値は署名の検証に使用されます。 また、この値は既定でアプリ設定 "WebPubSubConnectionString" で自動的に解決されます。 また、 null 検証は必要なく、常に成功します。

使用法

C# で WebPubSubEventRequest は、型が認識されたバインディング パラメーターであり、残りのパラメーターはパラメーター名によってバインドされます。 下の使用可能なパラメーターと型の表を確認してください。

JavaScript のような弱く型指定された言語では、in を使用して、 namefunction.json 以下のマッピング テーブルに関するトリガー オブジェクトをバインドします。 そして、トリガー入力のfunction.jsonバインディングオブジェクトとして設定されている場合namedata適宜メッセージを変換する点に関dataTypeする。 すべてのパラメーターは読み取 context.bindingData.<BindingName> り可能で、 JObject 変換されます。

バインディング名 バインドの種類 説明 プロパティ
request WebPubSubEventRequest アップストリーム要求を記述します 派生クラス ConnectEventRequestConnectedEventRequestUserEventRequestDisconnectedEventRequest を含め、イベントの種類によってプロパティは異なります
connectionContext WebPubSubConnectionContext 一般的な要求情報 EventType、EventName、Hub、ConnectionId、UserId、Headers、Origin、Signature、States
データ BinaryData,string,Stream,byte[] ユーザー message イベントでのクライアントからの要求メッセージ データ -
dataType WebPubSubDataType をサポートbinarytextする要求メッセージ dataTypejson -
claims IDictionary<string, string[]> システム connect 要求でのユーザー要求 -
query IDictionary<string, string[]> システム connect 要求でのユーザー クエリ -
subprotocols IList<string> システム connect 要求での使用可能なサブプロトコル -
clientCertificates IList<ClientCertificate> システム connect 要求でのクライアントからの証明書の拇印のリスト -
reason string システム disconnected 要求での理由 -

重要

C# では、関数バインドを正しく行うために、複数の型がサポートされるパラメータを最初 (つまり、既定値の BinaryData 型以外の request または data) に入れる必要があります

応答を返す

WebPubSubTrigger は、同期イベントとユーザー イベント connect に対する顧客から返された応答を尊重します。 一致した応答のみがサービスに送り返されます。それ以外の場合は無視されます。 さらに、WebPubSubTrigger 戻りオブジェクトでは、接続のメタデータを管理するために、ユーザによる SetState()ClearStates() がサポートされます。 そして、拡張機能は戻り値の結果を要求 WebPubSubConnectionContext.Statesの元の結果とマージします。 既存のキーの値が上書きされ、新しいキーの値が追加されます。

返り値の種類 説明 プロパティ
ConnectEventResponse connect イベントの応答 Groups、Roles、UserId、Subprotocol
UserEventResponse ユーザー イベントの応答 DataType、Data
EventErrorResponse 同期イベントのエラー応答 Code、ErrorMessage
*WebPubSubEventResponse 戻り値が不明な場合に使用される、サポートされている基本の応答の種類 -

入力バインド

拡張機能では、さまざまなニーズに対応する 2 つの入力バインドを提供しています。

  • WebPubSubConnection

    クライアントを Azure Web PubSub サービスに接続させるには、それがサービス エンドポイント URL と有効なアクセス トークンを認識している必要があります。 WebPubSubConnection 入力バインディングによって必要な情報が生成されるため、クライアントはこのトークン生成自体を処理する必要がありません。 トークンは時間制限があり、接続に対して特定のユーザーを認証するために使用できるため、トークンをキャッシュしたり、クライアント間で共有したりしないでください。 この入力バインドと連携する HTTP トリガーは、クライアントが接続情報を取得するために使用できます。

  • WebPubSubContext

    Static Web Apps を使用している場合は、HttpTrigger がサポートされている唯一のトリガーであり、Web PubSub のシナリオでは、WebPubSubContext 入力バインディングを提供し、ユーザーが Web PubSub プロトコルでサービス側からアップストリームの http 要求を逆シリアル化するのに役立ちます。 顧客は、関数で簡単に処理するために、WebPubSubTrigger と比較して同様の結果を得ることができます。 下記のを参照してください。 HttpTrigger と共に使用する場合、顧客は、HttpTrigger で公開されている URL をイベント ハンドラーで適宜構成する必要があります。

例 - WebPubSubConnection

次の例は、入力バインドを使用して Web PubSub 接続情報を取得し、HTTP 経由でそれを返す C# 関数を示しています。 次の例では、UserId は、?userid={User-A} のようにクライアント要求のクエリ部分を使用して渡されます。

[FunctionName("WebPubSubConnectionInputBinding")]
public static WebPubSubConnection Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
    [WebPubSubConnection(Hub = "<hub>", UserId = "{query.userid}")] WebPubSubConnection connection)
{
    return connection;
}

認証済みトークン

認証済みクライアントによって関数がトリガーされている場合は、ユーザー ID 要求を生成済みトークンに追加できます。 App Service 認証を使用すると、認証を関数アプリに簡単に追加することができます。

App Service 認証によって、x-ms-client-principal-id および x-ms-client-principal-name という名前の HTTP ヘッダーが設定されます。この 2 つの HTTP ヘッダーには、認証済みユーザーのクライアント プリンシパルの ID と名前がそれぞれ含まれています。

バインドの UserId プロパティをいずれかのヘッダーの値に設定するには、バインド式 {headers.x-ms-client-principal-id} または {headers.x-ms-client-principal-name} を使用します。

[FunctionName("WebPubSubConnectionInputBinding")]
public static WebPubSubConnection Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
    [WebPubSubConnection(Hub = "<hub>", UserId = "{headers.x-ms-client-principal-name}")] WebPubSubConnection connection)
{
    return connection;
}

Note

バインド パラメーターの型に限定すると、リストや配列を渡す方法はサポートされません。これは、WebPubSubConnectionサーバー SDK が持つすべてのパラメーター (特にroles、 および 〘 を含むgroupsexpiresAfterパラメーター) では完全にはサポートされていません。 お客様がロールを追加したり、関数内のアクセス トークンのビルドを遅らせたりする必要がある場合は、C# 用サーバー SDK を使用することをお勧めします。

[FunctionName("WebPubSubConnectionCustomRoles")]
public static async Task<Uri> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req)
{
    var serviceClient = new WebPubSubServiceClient(new Uri(endpoint), "<hub>", "<web-pubsub-connection-string>");
    var userId = req.Query["userid"].FirstOrDefault();
    // your method to get custom roles.
    var roles = GetRoles(userId);
    return await serviceClient.GetClientAccessUriAsync(TimeSpan.FromMinutes(5), userId, roles);
}

例- WebPubSubContext

次の例は、connect イベントの種類で入力バインドを使用して Web PubSub アップストリーム要求情報を取得し、HTTP 経由でそれを返す C# 関数を示しています。

[FunctionName("WebPubSubContextInputBinding")]
public static object Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
    [WebPubSubContext] WebPubSubContext wpsContext)
{
    // in the case request is a preflight or invalid, directly return prebuild response by extension.
    if (wpsContext.IsPreflight || wpsContext.HasError)
    {
        return wpsContext.Response;
    }
    var request = wpsContext.Request as ConnectEventRequest;
    var response = new ConnectEventResponse
    {
        UserId = wpsContext.Request.ConnectionContext.UserId
    };
    return response;
}

構成

WebPubSubConnection

次の表は、function.json ファイルと WebPubSubConnection 属性で設定したバインド構成のプロパティを説明しています。

function.json のプロパティ 属性のプロパティ 説明
type 該当なし webPubSubConnection に設定されている必要があります。
direction 該当なし in に設定されている必要があります。
name 該当なし 入力接続バインド オブジェクトの関数コードで使用される変数名。
hub ハブ 必須 - この値は、トリガーされる関数の Web PubSub ハブの名前に設定する必要があります。 高い優先順位として属性への値の設定をサポートしていますが、またはグローバル値としてアプリ設定に設定することもできます。
userId UserId 省略可能 - アクセス キー トークンに設定するユーザー識別子要求の値。
connection つながり 必須 - Web PubSub Service 接続文字列を含むアプリ設定の名前 (既定値は "WebPubSubConnectionString")。

WebPubSubContext

次の表は、functions.json ファイルと WebPubSubContext 属性に設定したバインド構成のプロパティを説明しています。

function.json のプロパティ 属性のプロパティ 説明
type 該当なし webPubSubContext に設定する必要があります。
direction 該当なし in に設定する必要があります。
name 該当なし 入力 Web PubSub 要求の関数コードで使用される変数名。
connection つながり 省略可能 - アップストリームの Azure Web PubSub サービスを指定するアプリ設定または設定コレクションの名前。 この値は、不正使用の保護と署名の検証に使用されます。 この値は、既定で "WebPubSubConnectionString" で自動的に解決されます。 また、 null 検証は必要なく、常に成功します。

使用方法

WebPubSubConnection

WebPubSubConnection では以下のプロパティが提供されます。

バインディング名 バインドの種類 説明
BaseUri Uri Web PubSub クライアント接続 URI。
Uri Uri Web PubSub 接続の絶対 URI。要求に基づいて生成された AccessToken が含まれます。
AccessToken string 要求の UserId とサービス情報に基づいて生成された AccessToken

WebPubSubContext

WebPubSubContext では以下のプロパティが提供されます。

バインディング名 バインドの種類 説明 プロパティ
request WebPubSubEventRequest クライアントからの要求。詳細については、下の表を参照してください。 要求ヘッダーの WebPubSubConnectionContext と要求本文から逆シリアル化された他のプロパティでは要求を説明します (DisconnectedEventRequestReason など)。
応答 HttpResponseMessage 拡張機能によって、主に AbuseProtection とエラー ケースに対する応答が作成されます。 -
errorMessage string アップストリーム要求を処理するときのエラーの詳細を説明します。 -
hasError [bool] 有効な Web PubSub アップストリーム要求かどうかを示すフラグ。 -
isPreflight [bool] AbuseProtection のプレフライト要求かどうかを示すフラグ。 -

WebPubSubEventRequest の場合、要求シナリオに関するさまざまな情報を提供するさまざまなクラスに逆シリアル化されます。 PreflightRequest または無効なケースの場合、ユーザーは IsPreflight および HasError フラグを調べて確認できます。 システムによって作成された応答 WebPubSubContext.Response を直接返すことが推奨されます。または、顧客が必要に応じてエラーをログに記録することもできます。 さまざまなシナリオで、顧客は次のように要求のプロパティを読み取ることができます。

派生クラス 説明 プロパティ
PreflightRequest IsPreflighttrue の場合に AbuseProtection で使用します -
ConnectEventRequest システム Connect イベントの種類で使用します Claims、Query、Subprotocols、ClientCertificates
ConnectedEventRequest システム Connected イベントの種類で使用します -
UserEventRequest ユーザー イベントの種類で使用します Data、DataType
DisconnectedEventRequest システム Disconnected イベントの種類で使用します Reason

Note

WebPubSubContext は、HttpTriggerWebPubSubTriggerと同様に要求を逆シリアル化できる入力バインドですが、マージ後の接続状態がサポートされていないなどの制限があります。 戻り値の応答はサービス側で引き続き尊重されますが、ユーザーは応答を自分で作成する必要があります。 ユーザーがイベント応答を設定する必要がある場合は、ConnectEventResponse またはユーザー イベントのメッセージを含む HttpResponseMessage応答本文として返し、ce-connectionstate キーを含む接続状態を応答ヘッダーに配置する必要があります。

出力バインド

Web PubSub 出力バインドを使用して Azure Web PubSub サービスを呼び出し、なんらかの処理を実行します。 次の宛先にメッセージをブロードキャストできます。

  • 接続されているすべてのクライアント
  • 特定のユーザーに対して認証された接続されているクライアント
  • 特定のグループに参加している接続されているクライアント
  • 特定のクライアント接続

出力バインドを使用して、クライアントとグループを管理し、特定の connectionId を対象とするアクセス許可をグループに付与したり、取り消したりすることもできます。

  • グループに接続を追加する
  • ユーザーをグループに追加
  • グループから接続を削除する
  • グループからユーザーを削除
  • ユーザーをすべてのグループから削除する
  • すべてのクライアント接続を閉じる
  • 特定のクライアント接続を閉じる
  • グループ内の接続を閉じる
  • 接続のアクセス許可を付与する
  • 接続のアクセス許可を取り消す

セットアップと構成の詳細については、概要に関するページをご覧ください。

[FunctionName("WebPubSubOutputBinding")]
public static async Task RunAsync(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
    [WebPubSub(Hub = "<hub>")] IAsyncCollector<WebPubSubAction> actions)
{
    await actions.AddAsync(WebPubSubAction.CreateSendToAllAction("Hello Web PubSub!", WebPubSubDataType.Text));
}

WebPubSubAction

WebPubSubAction は、出力バインドの基本抽象型です。 派生型は、サーバーがサービスに呼び出させるアクションを表します。

C# 言語では、使用可能なアクションを検出できるように、WebPubSubAction に静的メソッドがいくつか用意されています。 たとえば、ユーザーは WebPubSubAction.CreateSendToAllAction() を呼び出して SendToAllAction を作成できます。

派生クラス プロパティ
SendToAllAction Data、DataType、Excluded
SendToGroupAction Group、Data、DataType、Excluded
SendToUserAction UserId、Data、DataType
SendToConnectionAction ConnectionId、Data、DataType
AddUserToGroupAction UserId、Group
RemoveUserFromGroupAction UserId、Group
RemoveUserFromAllGroupsAction UserId
AddConnectionToGroupAction ConnectionId、Group
RemoveConnectionFromGroupAction ConnectionId、Group
CloseAllConnectionsAction Excluded、Reason
CloseClientConnectionAction ConnectionId、Reason
CloseGroupConnectionsAction Group、Excluded、Reason
GrantPermissionAction ConnectionId、Permission、TargetName
RevokePermissionAction ConnectionId、Permission、TargetName

構成

WebPubSub

次の表は、function.json ファイルと WebPubSub 属性で設定したバインド構成のプロパティを説明しています。

function.json のプロパティ 属性のプロパティ 説明
type 該当なし webPubSub に設定されている必要があります。
direction 該当なし out に設定されている必要があります。
name 該当なし 出力バインド オブジェクトの関数コードで使用される変数名。
hub ハブ この値は、トリガーされる関数の Web PubSub ハブの名前に設定する必要があります。 高い優先順位として属性への値の設定をサポートしていますが、またはグローバル値としてアプリ設定に設定することもできます。
connection つながり Web PubSub Service 接続文字列を含むアプリ設定の名前 (既定値は "WebPubSubConnectionString")。

トラブルシューティング

コンソール ログの設定

また、サービスに対して行う要求の詳細を確認する場合は、単にコンソールのログ記録を有効にすることもできます。

次のステップ

これらのリソースを使用して、独自のアプリケーションの構築を開始します。