在 Azure SignalR 服务中使用无服务器模式时,可以创建到上游服务的出站专用终结点连接。
上游服务(例如 Azure Web 应用和 Azure Functions)可以配置为接受来自虚拟网络列表的连接,并拒绝源自公用网络的外部连接。 若要访问这些终结点,可以创建出站专用终结点连接。
此出站方法需要符合下列要求:
- 上游服务必须是 Azure Web 应用或 Azure 函数。
- Azure SignalR 服务不得位于免费层中。
- Azure Web 应用或 Azure Function 必须位于特定 SKU 中。 请参阅为 Azure Web 应用使用专用终结点。
本文介绍如何创建具有出站专用终结点连接的共享专用终结点,以保护流向上游 Azure 函数实例的出站流量。
可以通过 SignalR 服务 API 创建受保护资源的专用终结点。 这些终结点称为共享专用链接资源,可用于共享对资源(例如与 Azure 专用链接服务集成的 Azure 函数)的访问权限。 这些专用终结点是在 SignalR 服务执行环境中创建的,不能在此环境外部访问。
需要准备好以下资源才能完成本文中的步骤:
本文中的示例基于以下假设:
- SignalR 服务的资源 ID 为 /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/contoso/providers/Microsoft.SignalRService/signalr/contoso-signalr。
- Azure Function 上游的资源 ID 为 _/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/contoso/providers/Microsoft.Web/sites/contoso-func。
其余示例显示了如何配置 contoso-signalr 服务,以便其对函数的上游调用可以通过专用终结点而非公用网络进行。
可以在示例中使用自己的资源 ID。
在 Azure 门户中,转到 Azure SignalR 服务资源。
通过左侧菜单选择“网络”。
选择“专用访问”选项卡。
在“共享专用终结点”部分选择“添加共享专用终结点”。
输入以下信息:| 字段 | 说明 | | ----- | ----------- | | 名称 | 共享专用终结点的名称。 | | 类型 | 选择“Microsoft.Web/sites” | | 订阅 | 包含函数应用的订阅。 | | 资源 | 输入函数应用的名称。 | | 请求消息 | 输入“请批准”|
选择添加。
共享的专用终结点资源将处于“成功”预配状态。 连接状态是目标资源端的“挂起”审批。
可以进行以下 API 调用,以创建共享专用链接资源:
az rest --method put --uri https://management.chinacloudapi.cn/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/contoso/providers/Microsoft.SignalRService/signalr/contoso-signalr/sharedPrivateLinkResources/func-pe?api-version=2021-06-01-preview --body @create-pe.json
代表 API 的请求正文的 create-pe.json 文件的内容如下:
{
"name": "func-pe",
"properties": {
"privateLinkResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/contoso/providers/Microsoft.Web/sites/contoso-func",
"groupId": "sites",
"requestMessage": "please approve"
}
}
创建出站专用终结点的过程是一个长期(异步)操作。 与所有异步 Azure 操作一样,PUT
调用会返回 Azure-AsyncOperation
标头值,如以下示例所示:
"Azure-AsyncOperation": "https://management.chinacloudapi.cn/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/contoso/providers/Microsoft.SignalRService/signalr/contoso-signalr/operationStatuses/c0786383-8d5f-4554-8d17-f16fcf482fb2?api-version=2021-06-01-preview"
定期轮询此 URI,通过手动查询 Azure-AsyncOperationHeader
值来获取操作的状态,
az rest --method get --uri https://management.chinacloudapi.cn/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/contoso/providers/Microsoft.SignalRService/signalr/contoso-signalr/operationStatuses/c0786383-8d5f-4554-8d17-f16fcf482fb2?api-version=2021-06-01-preview
等待状态更改为“成功”,再继续执行后续步骤。
重要
批准专用终结点连接后,将无法再从公用网络访问函数。 可能需要在虚拟网络中创建其他专用终结点才能访问函数终结点。
在 Azure 门户中,转到函数应用。
从左侧菜单中选择“网络”。
选择“专用终结点连接”。
在“入站流量”中选择“专用终结点”。
选择专用终结点连接的“连接名称”。
选择“批准”。
请确保显示的专用终结点连接如以下屏幕截图所示。 更新状态可能需要几分钟时间。
列出专用终结点连接。
az network private-endpoint-connection list -n <function-resource-name> -g <function-resource-group-name> --type 'Microsoft.Web/sites'
应有一个挂起的专用终结点连接。 记下其 ID。
[
{
"id": "<id>",
"location": "",
"name": "",
"properties": {
"privateLinkServiceConnectionState": {
"actionRequired": "None",
"description": "Please approve",
"status": "Pending"
}
}
}
]
批准专用终结点连接。
az network private-endpoint-connection approve --id <private-endpoint-connection-id>
审批需要几分钟才能传播到 SignalR 服务。 可以使用 Azure 门户或 Azure CLI 来检查状态。
az rest --method get --uri https://management.chinacloudapi.cn/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/contoso/providers/Microsoft.SignalRService/signalr/contoso-signalr/sharedPrivateLinkResources/func-pe?api-version=2021-06-01-preview
该命令将返回一个 JSON 结构,其中的连接状态在“properties”节中显示为“status”。
{
"name": "func-pe",
"properties": {
"privateLinkResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/contoso/providers/Microsoft.Web/sites/contoso-func",
"groupId": "sites",
"requestMessage": "please approve",
"status": "Approved",
"provisioningState": "Succeeded"
}
}
当资源的“预配状态”(properties.provisioningState
) 为“Succeeded
”且“连接状态”(properties.status
) 为“Approved
”时,表示共享专用链接资源正常工作,SignalR 服务可以通过专用终结点进行通信。
此时将建立 SignalR 服务和 Azure Functions 之间的专用终结点。
设置专用终结点后,可以通过检查上游端的 X-Forwarded-For
标头来验证来自专用 IP 的传入调用。
如果不打算使用在本文中的创建资源,则可以删除资源组。
注意
删除资源组会删除其中包含的所有资源。 如果指定的资源组中存在本文范围外的资源,这些资源也会被删除。
详细了解专用终结点: