Azure Function in subnet connecting to Sql database with firewall subnet rules 间歇性地使用错误的 IP

Azure Function in subnet connecting to Sql database with firewall subnet rules intermittently using wrong IP

在我目前的情况下,我们有几个 Azure Function 应用程序与 Azure SQL 数据库对话(使用 Entity Framework,如果重要的话),使用在 Azure ServiceBus 触发器上触发的函数。

过去几周,我们一直在通过使用 VNET 和子网提高安全性,以仅允许需要使用它的 Function 应用程序访问 Azure 数据库服务器。但是,我却运行陷入了一个奇怪的问题。似乎现在数据库服务器设置为禁止除了我的功能应用程序运行定义的子网之外的流量,功能应用程序在连接到数据库时开始出现间歇性的SQL异常,并显示一些消息数据库防火墙规则不允许特定 IP。奇怪的是这个错误并不一致。我希望函数应用程序因其 IP 在防火墙处被拒绝,或者一直被允许,但不是像目前这样随机。

问题

我的设置是否遗漏了什么?或者,我如何强制子网中的函数应用程序使用数据库服务器防火墙规则允许的内部 IP,而不是数据库防火墙规则之外的其他出站 IP 地址? 或者:有什么可能解释对数据库的访问有时成功(表明功能应用程序使用了正确的内部 IP),有时在防火墙上失败(IP 地址未知),似乎是随机的。

希望有人能帮忙!

情况详细说明

Function App 有一个由服务总线触发器触发的函数。 Function App 是 运行 P1v2 Premium 服务计划,启用了 Vnet 集成。

该应用程序 运行 在我们环境中的一个子网内运行,该子网具有定义的 IP 地址范围和 /26 子网掩码。如果我检查 Kudu 中功能应用程序的环境变量,我可以看到 PRIVATE_IP_ADDRESS 设置在子网范围内。数据库防火墙设置为禁止所有流量,除了我的函数应用程序的子网如下:

触发将一些东西写入数据库的函数应用程序有时会起作用(表明至少在函数的 IP 地址正确时,对数据库的访问是有效的)但是,也有很多SQL 异常并出现以下错误:

无法打开登录请求的服务器 'database-server-name'。不允许 IP 地址为 'XXX.XXX.XXX.XXX' 的客户端访问服务器。要启用访问,请在 master 数据库上使用 Windows Azure 管理门户或 运行 sp_set_firewall_rule 为该 IP 地址或地址范围创建防火墙规则。此更改最多可能需要五分钟才能生效。

错误中提到的 IP 地址不是在 Vnet 或子网 IP 范围内定义的内部 IP。它甚至不是出现在函数应用程序的可能出站 IP 地址中的 IP 之一,

这些或多或少是随机发生的。有时它们不会出现 x 触发器,有时它会连续数百次调用失败。

启用 Datbaase 服务器设置“允许 Azure 服务和资源访问此数据库服务器”可阻止错误发生,但这当然与配置防火墙以允许某些子网相反

我试过的

你的 Azure Functions 将只使用从你的 VNet 中选择的私有出站 IP 地址,当你有 VNet integration enabled。 VNet 集成选项仅在功能高级计划中可用。

此外,您已经提到的环境变量 WEBSITE_VNET_ROUTE_ALL 和 WEBSITE_DNS_SERVER 应该设置以及提到的 here (假设您的 SQL 服务器在同一个 VNet 中).

当然,新的一天和新的视角会带来可能的答案。

虽然我没有更改我在问题中提到的设置的任何内容,但我正在再次阅读此 post:https://docs.microsoft.com/en-us/azure/azure-functions/ip-addresses#outbound-ip-address-changes

它提到临时切换服务计划强制更改 IP。我最初将此误解为在 DEV 和高级计划之间切换,这是不可能发生的,因为 DEV 计划不支持 VNET 集成。所以我在 P1v2 和 P1v3 计划之间切换了计划。然而,这没有用。

这里的意思是在S1和P1v2计划之间切换。标准计划隐藏在这个 link:

后面

它还会将这个小消息网显示到“应用”按钮。

在 S1 和 P1v2 计划之间切换片刻并将死信服务总线消息重新提交到函数应用程序后,一切又开始工作了。

我认为 IP 切换是必要的,但在 P 计划之间切换并不是触发它的原因。它必须介于标准和高级之间。