我创建了一个SQL Server,然后使用私有IP 10.1.1.4
与我的TESTVNET / SUBNET1创建了私有链接。我现在已禁用了SQL Server的公共访问权限。
我有一个运行在App Service上的Azure功能,该功能已与VNET / SUBNET2集成了VNET。 子网2显示它已委派给服务器场。 (同样,如果有人可以解释委托的含义,我发现我也无法在该子网中创建任何VM,可能对其他任何目的都没有用)
现在当我的azure函数尝试连接到数据库时。它失败并显示以下错误:
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。所以现在如果我启用了公共访问Internet,并允许Azure服务访问数据库(我认为Azure默认情况下添加了公共IP)。该功能已连接到数据库。
现在,我想了解我要去哪里哪里以及为什么专用端点连接不起作用。任何帮助表示赞赏。
TESTVNET
:10.1.0.0/16
SUBNET 1
:10.1.1.0/24
SUBNET 2
:10.1.2.0/24
我在SUBNET 1和SUBNET 2中都禁用了SQL的服务端点。我的NSG具有默认设置,即 AllowVnetInBound,AllowAzureLoadBalancerInBound,DenyAllInBound AllowVnetOutBound,AllowInternetOutBound,DenyAllOutBound。 由于我的专用链接在同一VNET中存在专用IP,因此我认为NSG不会产生任何影响。
Azure的新手,进行测试。谢谢您的耐心等候。
答案 0 :(得分:3)
要使Azure Function连接到私有终结点,您将需要使用VNET integration。
您的应用程序与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。参考here。
然后您可以set up Private Link for Azure SQL Database。您可以从与check connectivity using SQL Server Management Studio (SSMS)相同的VNet中的新子网中创建一个Azure VM。如果启用私有终结点,则应从该Azure VM获取客户端私有IP,以将Azure SQL数据库与其FQDN连接起来。
有关更多信息,您可以在this blog中阅读私有端点VS服务端点。