首页 > 解决方案 > 无法使用专用终结点将 Azure Function 与 Azure SQL 连接

问题描述

我创建了一个 SQL Server,然后用我的 TESTVNET/SUBNET1 和 private IP 创建了一个私有链接10.1.1.4。我现在禁用了 SQL 服务器的公共访问。

我在应用服务上运行了一个 Azure 功能,我已经将 VNET 与 VNET/SUBNET2 集成。 子网映像子网 2 显示它已委派给服务器场。(如果有人可以解释委托的含义,我发现我也无法在该子网中创建任何虚拟机,可能它只是不能用于任何其他目的)

现在,当我的天蓝色函数尝试连接到数据库时。它失败并出现以下错误:

2020-08-30T15:25:45.216 [Error] Unhandled rejection SequelizeAccessDeniedError: Cannot open server "10.1.1.4" requested by the login. The login failed. 但是,如果我提供公共 FQDN,它会给我以下错误。

2020-08-30T15:29:43.654 [Error] Unhandled rejection SequelizeAccessDeniedError: Reason: An instance-specific error occurred while establishing a connection to SQL Server. The public network interface on this server is not accessible. To connect to this server, use the Private Endpoint from inside your virtual network.

在这里,由 Private 端点创建的 Private DNS 本来应该理想地用于获取 SQL 数据库的私有 IP,但似乎该函数没有使用私有 DNS,可能是因为没有在隔离环境中运行。

现在在我的 Azure 功能应用程序设置中,我添加了WEBSITE_VNET_ROUTE_ALL =1这应该意味着所有请求都应该路由到 VNET。所以现在如果我启用公共访问互联网,并允许 Azure 服务访问数据库(我认为 azure 默认添加了公共 IP)。该函数连接到数据库。现在我想了解我哪里出错了,为什么私有端点连接不起作用。任何帮助表示赞赏。

在数据库防火墙设置中,我允许从下面到子网的流量: 数据库防火墙设置 网络配置

TESTVNET10.1.0.0/16

SUBNET 110.1.1.0/24

SUBNET 210.1.2.0/24

我已在 SUBNET 1 和 SUBNET 2 中禁用 SQL 服务端点。我的 NSG 具有默认设置,即 AllowVnetInBound、AllowAzureLoadBalancerInBound、DenyAllInBound AllowVnetOutBound、AllowInternetOutBound、DenyAllOutBound。由于我的私有链接在同一个 VNET 中存在私有 IP,我认为 NSG 不会产生任何影响。

Azure 新手,正在测试。感谢您的耐心等待。

标签: azurenetworkingazure-functionsazure-sql-database

解决方案


要使 Azure Function 连接到专用终结点,您需要使用VNET 集成

应用与 VNet 集成后,它使用配置 VNet 的同一 DNS 服务器。默认情况下,你的应用不能与 Azure DNS 专用区域一起使用。若要使用 Azure DNS 专用区域,您需要添加以下应用设置:

WEBSITE_DNS_SERVER with value 168.63.129.16
WEBSITE_VNET_ROUTE_ALL with value 1

除了使您的应用程序能够使用 Azure DNS 专用区域外,这些设置还会将您的所有出站呼叫从您的应用程序发送到您的 VNet。参考这里

然后,您可以为 Azure SQL 数据库设置专用链接。您可以从同一 VNet 中的新子网创建 Azure VM,以使用 SQL Server Management Studio (SSMS) 检查连接性。如果启用专用终结点,则应从该 Azure VM 获取客户端专用 IP,以将 Azure SQL 数据库与其 FQDN 连接。

有关更多信息,您可以阅读此博客中的私有端点 VS 服务端点。


推荐阅读