使用托管专用终结点,可以通过批准的专用链接设置安全地将 Microsoft Fabric 工作负载(如 Spark 或数据管道)连接到 本地 或 自定义托管数据源 。
此方法可确保流量流经Microsoft主干网络而不是公共 Internet,从而维护端到端数据隐私和合规性。
常见用例包括访问:
- SAP、Oracle 数据库、Elasticsearch、非原生 Azure 数据源(如 Confluent Kafka、Elasticsearch 或托管于本地环境中的数据源)等。
- Azure VM 上的数据源
- 在虚拟网络或自管理数据中心中托管的自定义 API 或服务。
- 在不公开公共终结点的情况下保护公司数据存储。
概述
Fabric 托管专用终结点(MPE)允许 Fabric 使用专用链接服务(PLS)与已批准的数据源建立出站连接。
设置涉及三个主要步骤:
- 数据源所有者或管理员为通过专用 IP 地址在前端部署的资源配置 Azure 私有链接服务(PLS)。
- Fabric 工作区管理员创建一个托管专用终结点 (MPE),该终结点引用完全限定域名 (FQDN) 并使用专用链接服务的资源 ID。
- 数据源所有者或管理员在 Azure 中评审并批准连接请求。
批准后,所有 Fabric 数据工程工作负载(如 Notebook、Spark 作业定义、具体化 Lakeviews、Livy 终结点)都可以安全地连接到已批准的资源。
先决条件
开始之前:
- 具有工作区管理员角色的 Microsoft Fabric 工作区。
- Azure 订阅必须注册 Microsoft.Network 资源提供程序。
- 让数据源或服务在标准负载均衡器后面运行,该负载均衡器可通过专用链接服务访问。 详细了解专用链接服务
步骤 1:[如果负载均衡器没有专用链接服务设置,则可选] 为本地资源创建专用链接服务
若要向 Fabric 公开本地或自定义托管数据源(如 SQL Server),必须先在 Azure 中创建专用链接服务(PLS)。
- 登录到 Azure 门户。
- 在搜索栏中,输入 专用链接服务 并选择“ 创建”。
- 指定:
- 订阅 和 资源组
- Region
- 专用链接服务的名称
- 在 前端 IP 配置下,关联用于将流量路由到本地部署或虚拟机的负载均衡器。
- 定义 自动审批订阅 ID ,以自动批准来自受信任 Fabric 租户的连接请求。
小窍门
如果数据源托管在本地,请在配置 PLS 之前使用 Azure VPN 网关或 Azure ExpressRoute 将本地网络连接到 Azure。
步骤 2:使用 Fabric REST API 创建托管专用终结点
专用链接服务准备就绪后,通过调用 托管专用终结点 REST API 在 Fabric 中创建托管专用终结点(MPE)。 当前支持的终结点形状使用路径:
POST https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/managedPrivateEndpoints
在您目标定位以下任一项时,请使用该选项:
- 专用链接服务(使用
targetPrivateLinkResourceId,可选targetSubresourceType),和/或 - 希望 Fabric 在批准后私下解析一个或多个完全限定的域名(
targetFQDNs)。
可以使用任何 REST API 客户端(如 Bruno、 Insomnia 或 Postman )发送请求。
步骤 2.1:获取身份验证令牌
在调用 Fabric REST API 之前,请使用 Azure Active Directory (Entra ID) 凭据获取 持有者令牌 。
可以使用 Azure CLI 执行此作:
az login
az account get-access-token --resource https://api.fabric.microsoft.com
此命令返回包含访问令牌的 JSON 对象。 复制“accessToken”的值以用作授权标头。
步骤 2.2:构造 API 请求
使用以下端点和有效负载结构创建托管专用端点。 根据是绑定到专用链接服务、提供 FQDN 还是同时提供 FQDN 来调整字段。
请求
POST https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/managedPrivateEndpoints
Headers
| Key | 价值 |
|---|---|
| Authorization | Bearer 令牌<访问令牌> |
| Content-Type | application/json |
正文(针对专用链接服务 + FQDN 的示例)
{
"name": "onprem-sql-endpoint",
"targetPrivateLinkResourceId": "/subscriptions/<subId>/resourceGroups/<rg>/providers/Microsoft.Network/privateLinkServices/<plsName>",
"targetSubresourceType": "sql",
"targetFQDNs": ["sqlserver.corp.contoso.com"],
"requestMessage": "Private connection request from Fabric to on-premises SQL"
}
正文字段参考:
| 领域 | 必选 | 类型 | 注释 |
|---|---|---|---|
| 姓名 | 是的 | 字符串 | <= 64 个字符。 工作区中唯一。 |
| targetPrivateLinkResourceId | 是* | 字符串 | 专用链接服务或其他受支持的专用链接资源的资源 ID(*必要信息,除非将来的变体中仅支持 FQDN 工作流—请查阅当前文档)。 |
| requestMessage | 否 | 字符串 | <= 140 个字符。 展示给审批者。 |
| targetFQDN | 否 | 字符串[] | 最多关联 20 个 FQDN 用于私有解析。 |
| 目标子资源类型 | 否 | 字符串 | 子资源组(例如,sqlblob特定于服务)。 |
执行步骤:
- 打开 REST 客户端。
- 将方法设置为 POST 并粘贴终结点 URL(替换
{workspaceId})。 - 使用步骤 2.1 中的持有者令牌添加 Authorization 标头。
- 粘贴 JSON 正文并调整值。
- 发送请求。
步骤 2.3:验证连接请求
一个简化的成功响应有效负载示例可能如下:
{
"id": "f2cbd8d1-23f1-4b9a-9db2-23ad1e7b5129",
"name": "onprem-sql-endpoint",
"targetPrivateLinkResourceId": "/subscriptions/<subId>/resourceGroups/<rg>/providers/Microsoft.Network/privateLinkServices/<plsName>",
"targetFQDNs": ["sqlserver.corp.contoso.com"],
"targetSubresourceType": "sql",
"provisioningState": "PendingApproval",
"createdBy": "user@contoso.com",
"createdDateTime": "2025-10-14T10:12:37Z"
}
字段名称可以演变;如果缺少所需的字段,请重新检查最新的官方文档。 此时,专用连接请求已发送到目标数据源管理员(例如,Azure 中的专用链接服务的所有者)。 批准连接后,预配状态会更新为“已批准”,你可以开始从 Fabric 安全地访问本地数据。
示例:使用 Bruno 或 Insomnia
还可以直接在 Bruno 或 失眠中创建和测试终结点:
- 将请求类型设置为 POST。
- 粘贴 Fabric REST API 终结点。
- 在 “身份验证”中,选择 持有者令牌,并粘贴之前检索的令牌。
- 在 正文中,粘贴 JSON 有效负载。
- 单击“ 发送”。
API 将响应托管专用终结点详细信息和连接状态。
发送请求后,Fabric 将尝试启动专用连接。
网络管理员将在 Azure 门户中看到以下 挂起的连接请求 :
专用链接服务→专用终结点连接 窗口。
步骤 3:批准专用终结点连接请求
- 登录到 Azure 门户。
- 导航到 专用链接服务 资源。
- 在“网络”部分下选择“专用终结点连接”。
- 查看来自 Microsoft Fabric 的挂起连接请求。
- 选择 “批准 ”并提供可选理由。
步骤 4:从 Fabric 笔记本访问本地 SQL Server
批准后,托管的专用终结点将变为活动状态,可以从 Spark 笔记本或数据管道中使用。
使用 PySpark 连接到本地 SQL Server 的示例:
serverName = "sqlserver.corp.contoso.com" database = "SalesDB" dbPort = 1433 dbUserName = "<username>" dbPassword = "<password or Key Vault reference>" jdbcURL = f"jdbc:sqlserver://{serverName}:{dbPort};database={database}" connectionProps = { "user": dbUserName, "password": dbPassword, "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver" } df = spark.read.jdbc(url=jdbcURL, table="dbo.Customers", properties=connectionProps) display(df) # Write back to your Fabric Lakehouse df.write.mode("overwrite").format("delta").saveAsTable("Customers")
步骤 5:验证和排查专用连接问题
批准连接后,请务必确认 Fabric 流量以私密方式流动,且未使用公共终结点。
在 Fabric 中验证终结点状态
- 在 Fabric 工作区中,导航到 “设置”→“网络安全”。
- 在 “托管专用终结点”下,验证连接 状态 是否显示 “已批准”。
- 选择终结点名称以查看详细信息,例如:
- FQDN
- 连接状态
- 审批日期
- 专用链接资源 ID
如果状态显示 “挂起 ”或 “失败”,请检查:
- Azure 管理员已批准链接的专用链接服务中的请求。
- FQDN 的 DNS 解析指向专用终结点 IP 地址。
- 专用链接和 Fabric 区域位于同一 Azure 地理位置中。
验证 DNS 路由
从同一虚拟网络中的 Fabric Notebook 或连接的 VM 运行以下命令:
nslookup sqlserver.corp.contoso.com
确认返回的 IP 地址为 10.x.x.x 或 172.x.x.x.x 专用 IP,而不是公共 IP。 这确认 Fabric 正在通过专用链接路由解析 FQDN。
[!提示] 如果 DNS 仍解析为公共 IP,请更新 Azure 中的专用 DNS 区域,以包含映射到专用终结点的 FQDN 的 A 记录。
常见问题和解决方法
| 问题 | 可能的原因 | 解决方案 |
|---|---|---|
ProvisioningState = Failed |
本地管理员拒绝或删除了专用链接服务(PLS)。 | 重新创建托管专用终结点(MPE),并验证 PLS 是否仍然存在且可访问。 |
| DNS 解析为公共 IP 地址 | DNS 区域未链接到 Fabric 专用 DNS 区域。 | 添加或链接专用 DNS 区域到工作区虚拟网络,并为指向专用 IP 的 FQDN 创建 A 记录 。 |
| Spark 或数据管道的连接超时 | 网络 ACL 或防火墙正在阻止 Fabric 子网。 | 打开所需的端口(例如 1433 用于 SQL Server,1521 用于 Oracle),并确保允许出站访问私有链接终结点。 |
| 审批请求在 Azure 中不可见 | 专用链接服务所有者未启用 “自动审批” 或未列出 Fabric 租户 ID。 | 要求网络管理员在 Azure 门户中的 专用链接服务下查看挂起的连接→专用终结点连接 。 |
| 终结点意外删除 | 已重新分配 Fabric 工作区或容量,或更改了权限。 | 重新创建 MPE 并验证 Fabric 工作区所有权和网络设置。 |
| 审批后数据连接仍然失败 | Azure 与本地网络之间的 DNS 或路由不匹配。 | 验证路由表并使用 nslookup 或 Test-NetConnection 确认专用 IP 路径。 |
若要维护安全且合规的访问,请:
- 使用 Azure Key Vault 存储凭据和连接机密,而不是硬编码密码。
- 通过仅批准专用链接服务中所需的端点来限制网络暴露。
- 监视 Fabric 审核日志 以记录终结点的创建、审批或删除活动。
- 当从 Spark 工作负载进行连接时,为静态加密启用 客户管理密钥(CMK)。
- 使用 Fabric 的 出站访问保护(OAP)限制出站访问, 以确保工作负荷只能访问批准的专用终结点。
- 定期轮换凭证并定期查看接口审批。
端到端设置:将 Fabric 连接到本地 SQL Server 或任何外部数据源
如果 尚未设置专用链接服务,请按照以下步骤生成整个拓扑,从网络层到 Fabric 集成。
先决条件
- Azure 订阅 - 创建免费帐户。
- 虚拟网络 (VNet) - 在 Azure 门户中创建虚拟网络
- Azure 与本地之间的连接 - 通过 ExpressRoute 或 VPN 网关 ,还可以通过 Azure VM 和专用链接服务使用专用子网模拟本地。
可选选项:使用专用链接服务直接连接(预览版)
如果已知道本地或专用托管资源 的目标 IP 地址 ,则现在可以使用新的 专用链接服务 Direct Connect 功能(目前为 公共预览版)。
此功能允许将专用链接服务 直接连接到可专用路由的 IP 地址,而无需负载均衡器或 IP 转发虚拟机。
注释
专用链接服务 Direct Connect 目前为 公共预览版 ,可在选定区域中使用。
在 官方 Azure 文档中了解详细信息。
何时使用 Direct Connect
如果您需要使用这个选项:
- 你已有数据源的 静态专用 IP 地址 (例如,
10.0.1.50对于本地数据库或应用程序)。 - 在 Azure 中不需要负载均衡或 NAT 转发。
- 想要简化网络拓扑并减少延迟。
常见方案包括:
- 通过 ExpressRoute 或 VPN 直接连接到本地数据库或服务器。
- 通过专用 IP 访问第三方 SaaS 或网络设备。
- 依赖于基于 IP 的路由而不是 DNS 的旧应用程序。
主要优势
| Benefit | 说明 |
|---|---|
| 简化设置 | 无需创建或维护内部负载均衡器或转发 VM。 |
| 较低的延迟 | 直接将流量路由到目标 IP,而无需中间跃点。 |
| 支持基于 IP 的工作负荷 | 非常适合需要静态 IP 连接的应用程序。 |
| 降低 Azure 成本占用 | 消除简单连接模式的 VM 和负载均衡器成本。 |
重要注意事项
- 需要至少 2 个 IP 配置 (以 2 的倍数) 以实现高可用性。
- 仅支持静态目标 IP 地址。
- 源专用终结点、专用链接服务和 Fabric 工作区必须位于 同一区域 (尚不支持跨区域)。
- 仅在预览期的选定区域中可用: 美国中北部、美国东部 2、美国中部、美国中南部、美国西部、美国西部 2、美国西部 3、东南亚、澳大利亚东部、西班牙中部。
- 必须在 Azure 订阅中启用该功能标志
Microsoft.Network/AllowPrivateLinkserviceUDR。
示例:使用 PowerShell 创建专用链接服务 Direct Connect
以下示例创建一个 Private Link Service Direct Connect,以直接连接到目标 IP 地址 10.0.1.100。
# Variables
$resourceGroupName = "rg-pls-directconnect"
$location = "westus"
$vnetName = "pls-vnet"
$subnetName = "pls-subnet"
$plsName = "pls-directconnect"
$destinationIP = "10.0.1.100"
# Create resource group
New-AzResourceGroup -Name $resourceGroupName -Location $location
# Create VNet and subnet
$subnet = New-AzVirtualNetworkSubnetConfig -Name $subnetName -AddressPrefix "10.0.1.0/24" -PrivateLinkServiceNetworkPoliciesFlag "Disabled"
$vnet = New-AzVirtualNetwork -Name $vnetName -ResourceGroupName $resourceGroupName -Location $location -AddressPrefix "10.0.0.0/16" -Subnet $subnet
# Create IP configurations (minimum 2)
$subnet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $vnet -Name $subnetName
$ipConfig1 = @{ Name = "ipconfig1"; PrivateIpAllocationMethod = "Dynamic"; Subnet = $subnet; Primary = $true }
$ipConfig2 = @{ Name = "ipconfig2"; PrivateIpAllocationMethod = "Dynamic"; Subnet = $subnet; Primary = $false }
# Create Private Link Service Direct Connect
New-AzPrivateLinkService `
-Name $plsName `
-ResourceGroupName $resourceGroupName `
-Location $location `
-IpConfiguration @($ipConfig1, $ipConfig2) `
-DestinationIPAddress $destinationIP
创建后,可以使用 此新的专用链接服务 ID (/subscriptions/.../providers/Microsoft.Network/privateLinkServices/pls-directconnect)
在 构造托管专用终结点 设置中,如 步骤 2 中所述:使用上面的 Fabric REST API 创建托管专用终结点 。
小窍门
对于 Fabric 来说,过程是相同的 — 你仍然创建引用 PLS 资源 ID 的 MPE,
但基础 Azure 资源现在直接路由 到目标 IP ,而不是通过负载均衡器路由。
比较:标准连接与直接连接
| 方面 | 标准专用链接服务 | 专用链接服务直接连接(预览版) |
|---|---|---|
| 目标类型 | 负载均衡器前端 IP | 静态专用目标 IP |
| 典型使用 | 由负载均衡器或转发器虚拟机 (VM) 前置的应用程序或数据库 | 具有固定 IP 的数据库或自定义服务 |
| 设置复杂性 | 需要负载均衡器 + 可选的 NAT 转发 | 简单:直接指定目标 IP |
| 可用性 | 普遍可用 | 公共预览版(受限区域) |
| Fabric 集成 | 已支持 | 通过相同的 MPE API 流进行支持 |
| 非常适合 | 多虚拟机或高可用性服务 | 单节点专用 IP 工作负载 |
摘要:
如果环境已公开 Fabric 需要访问的 静态专用 IP 地址 ,请使用 专用链接服务 Direct Connect(预览版) 简化设置并减少网络开销。
否则,请遵循本文档中已涵盖 的标准专用链接服务 + 负载均衡器 模式。
步骤 1:为资源创建子网
| 子网 | Description |
|---|---|
| be-subnet | 托管 IP 转发器虚拟机的后端子网 |
| fe-subnet | 内部负载均衡器的前端子网 |
| pls-subnet | 用于托管专用链接服务的子网 |
步骤 2:创建标准内部负载均衡器
- 转到 “创建资源 > 网络 > 负载均衡器”。
- 配置:
- 类型: 内部
- SKU: 标准
- 子网: fe-subnet
- IP 分配: 动态
- 创建后端池、运行状况探测(TCP 22 或 1433)和规则(TCP 1433 → 1433)。
步骤 3:创建后端转发虚拟机
在be-subnet中创建一个或多个轻型 Ubuntu 虚拟机。
在创建过程中,将它们与负载均衡器后端池(myBackendPool)相关联。
预配后,请按照以下步骤启用 IP 转发并将 NAT 规则创建到本地 SQL Server IP(例如 10.0.0.47),
- 在 VM 上启用 IP 转发。
- 创建 DNAT 规则,将端口 1433 上的负载均衡器中的流量转发到端口 1433 上的本地 SQL Server IP(例如 10.0.0.47)。
- 为 NAT 创建 MASQUERADE 规则。
可以在 VM 上执行以下命令:
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1433 -j DNAT --to-destination 10.0.0.47:1433
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
小窍门
可以使用 ip_fwd.sh 帮助程序脚本自动执行此作。
步骤 4:创建专用链接服务(PLS)
- 转到 专用链接中心→创建专用链接服务。
- 在 “出站设置”下:
- 负载均衡器: 选择内部负载均衡器
- 前端 IP: LoadBalancerFrontEnd
-
源 NAT 子网:
pls-subnet
- 保留默认值,然后选择“ 创建”。
此服务现在通过专用链接终结点公开内部 SQL Server。
步骤 5:使用 REST API 连接构造
创建并激活专用链接服务后,返回到上述指南中的步骤 2,在 Fabric 中创建托管专用终结点(MPE)。
步骤 6 - 创建托管专用终结点
使用已在主指南的步骤 2 中记录的 REST API。 在 JSON 正文中,将 targetPrivateLinkResourceId 设置为 PLS 资源 ID,并可选择在 targetFQDNs 中包含将在 Spark 代码中使用的 FQDN。
步骤 7 - 批准和测试
在 PLS 中批准待定的连接(Azure 门户→私有终结点连接)。 然后使用 FQDN 运行 Spark JDBC 读取,以确认专用连接。
ARM 模板示例(可选)
使用下面的模板作为起点部署网络组件。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"subscriptionId": { "type": "string", "defaultValue": "<subscriptionId>" },
"resourceGroupName": { "type": "string", "defaultValue": "<resourceGroupName>" },
"location": { "type": "string", "defaultValue": "eastus" },
"vnetName": { "type": "string", "defaultValue": "fabric-onprem-vnet" }
},
"resources": [
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2023-09-01",
"name": "[parameters('vnetName')]",
"location": "[parameters('location')]",
"properties": {
"addressSpace": { "addressPrefixes": ["192.168.0.0/16"] },
"subnets": [
{ "name": "be-subnet", "properties": { "addressPrefix": "192.168.1.0/24" } },
{ "name": "fe-subnet", "properties": { "addressPrefix": "192.168.2.0/24" } },
{ "name": "pls-subnet", "properties": { "addressPrefix": "192.168.3.0/24" } }
]
}
},
{
"type": "Microsoft.Network/loadBalancers",
"apiVersion": "2023-09-01",
"name": "myLoadBalancer",
"location": "[parameters('location')]",
"sku": { "name": "Standard" },
"properties": {
"frontendIPConfigurations": [
{
"name": "LoadBalancerFrontEnd",
"properties": { "subnet": { "id": "[concat(resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName')), '/subnets/fe-subnet')]" } }
}
]
}
}
]
}
可以扩展此模板以包括 VM 部署和专用链接服务定义。
常见高级模式注释
| 注意事项 | Guidance |
|---|---|
| 运行状况探测端口 | 使用一致可访问的端口(22 或轻型 TCP 侦听器),使 LB 看到后端正常。 |
| Windows 防火墙 | 确保没有 Windows 防火墙阻止将流量转发到的端口 |
| NAT VM 大小配置 | 小型VM通常足够,如果预期大规模并发会话,则需进行监控。 |
| 高可用性 | 对于生产环境,请在可用性集或区域中使用多个转发器 VM,并通过负载均衡进行分配。 |
| Connectivity | 确保已使用名称或 IP 地址在 IP 转发虚拟机与数据源之间建立连接。 |
| 安全性 | 将 NSG 限制为仅需要来自受信任范围的入站(1433 到转发器)和管理端口(22)。 |