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 ではオンラインのみ) | バインディングを追加する | 関数アプリを再発行せずにポータルで既存のバインディング拡張機能を更新するには、拡張機能の更新に関する記事を参照してください。 |
重要な概念
(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>
例
[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
と EventErrorResponse
が考慮され、ユーザー イベントでは UserEventResponse
と EventErrorResponse
が考慮されます。現在のシナリオと一致しない残りの型は無視されます。 さらに、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 イベントの種類の場合、イベント名は connect 、connected 、disconnected である必要があります。 ユーザー定義のサブプロトコルの場合、イベント名は message です。 システムでサポートされているサブプロトコル json.webpubsub.azure.v1. の場合、イベント名はユーザー定義のイベント名です。 |
connection | つながり | 省略可能 - アップストリームの Azure Web PubSub サービスを指定するアプリ設定または設定コレクションの名前。 値は署名の検証に使用されます。 また、値は既定でアプリ設定の "WebPubSubConnectionString" を使用して自動解決されます。 null は、検証が不要であり、常に成功することを意味します。 |
使用法
C# で WebPubSubEventRequest
は、型が認識されたバインディング パラメーターであり、残りのパラメーターはパラメーター名によってバインドされます。 下の使用可能なパラメーターと型の表を確認してください。
JavaScript のような厳密に型指定されていない言語では、下のマッピング テーブルに関して、function.json
の name
を使用してトリガー オブジェクトがバインドされます。 さらに、トリガー入力のバインディング オブジェクトとして name
が data
に設定されている場合に、function.json
の dataType
が考慮され、それに応じてメッセージが変換されます。 すべてのパラメーターは context.bindingData.<BindingName>
から読み取ることができ、JObject
変換されます。
バインディング名 | バインドの種類 | 説明 | プロパティ |
---|---|---|---|
request | WebPubSubEventRequest |
アップストリーム要求を記述します | 派生クラス ConnectEventRequest 、ConnectedEventRequest 、UserEventRequest 、DisconnectedEventRequest を含め、イベントの種類によってプロパティは異なります |
connectionContext | WebPubSubConnectionContext |
一般的な要求情報 | EventType、EventName、Hub、ConnectionId、UserId、Headers、Origin、Signature、States |
データ | BinaryData 、string 、Stream 、byte[] |
ユーザー message イベントでのクライアントからの要求メッセージ データ |
- |
dataType | WebPubSubDataType |
要求メッセージのデータ型。binary 、text 、json がサポートされています |
- |
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
) で完全にサポートされるわけではありません。また、groups
と expiresAfter
も含まれます。 お客様がロールを追加したり、関数内のアクセス トークンのビルドを遅らせたりする必要がある場合は、C# 用 Server 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 と要求本文から逆シリアル化された他のプロパティでは要求を説明します (DisconnectedEventRequest の Reason など)。 |
応答 | HttpResponseMessage |
拡張機能によって、主に AbuseProtection とエラー ケースに対する応答が作成されます。 |
- |
errorMessage | string | アップストリーム要求を処理するときのエラーの詳細を説明します。 | - |
hasError | [bool] | 有効な Web PubSub アップストリーム要求かどうかを示すフラグ。 | - |
isPreflight | [bool] | AbuseProtection のプレフライト要求かどうかを示すフラグ。 |
- |
WebPubSubEventRequest
の場合、要求シナリオに関するさまざまな情報を提供するさまざまなクラスに逆シリアル化されます。 PreflightRequest
または無効なケースの場合、ユーザーは IsPreflight
および HasError
フラグを調べて確認できます。 システムによって作成された応答 WebPubSubContext.Response
を直接返すことが推奨されます。または、顧客が必要に応じてエラーをログに記録することもできます。 さまざまなシナリオで、顧客は次のように要求のプロパティを読み取ることができます。
派生クラス | 説明 | プロパティ |
---|---|---|
PreflightRequest |
IsPreflight が true の場合に AbuseProtection で使用します |
- |
ConnectEventRequest |
システム Connect イベントの種類で使用します |
Claims、Query、Subprotocols、ClientCertificates |
ConnectedEventRequest |
システム Connected イベントの種類で使用します |
- |
UserEventRequest |
ユーザー イベントの種類で使用します | Data、DataType |
DisconnectedEventRequest |
システム Disconnected イベントの種類で使用します |
Reason |
Note
WebPubSubContext
は、HttpTrigger
で WebPubSubTrigger
と同様に要求を逆シリアル化できる入力バインドですが、マージ後の接続状態がサポートされていないなどの制限があります。 返される応答はサービス側で引き続き考慮されますが、ユーザーは自分で応答を作成する必要があります。 ユーザーがイベント応答を設定する必要がある場合は、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")。 |
トラブルシューティング
コンソール ログの設定
また、サービスに対して行う要求の詳細を確認する場合は、単にコンソールのログ記録を有効にすることもできます。
次のステップ
これらのリソースを使用して、独自のアプリケーションの構築を開始します。