集成到 VNET 后无法连接到 Azure Function App

Unable to connect to Azure Function App after integrating into VNET

问题大纲

Azure Function App 集成到 VNET 并且 WEBSITE_VNET_ROUTE_ALL 设置为 1 后无法访问。

这是必需的,以便 Function App 可以安全地连接到 SQL 而无需使 SQL public 可用。

错误:

无法列出功能应用程序键。

同一网络中 VM 内的 HTTP 请求 (CURL) 失败:504 网关超时

架构图

重现步骤

  1. 创建资源组
  2. 创建地址为 10.20.11.0/26 的 VNET space
  3. 为函数应用创建一个子网以集成地址 范围 10.20.11.0/27
  4. 创建一个Linux Function App并集成到您创建的VNET中 在第 2 步中。
  5. 看到应用程序密钥仍然正常加载。
  6. 为数据库创建一个子网,地址范围为 10.20.11.32/27
  7. 创建 SQL 服务器和 SQL 数据库。
  8. 在数据库上使用 DNS 区域创建私有 Link 并限制 public访问。
  9. Link 在步骤 2 中创建的 VNET 的 DNS 区域。
  10. 函数应用将 SQL 私有 link 解析为 public IP 地址。
  11. 在Function App配置中,添加一个Application设置 WEBSITE_VNET_ROUTE_ALL 并将其设置为 1。
  12. 看到函数应用现在将 SQL 私有 link 解析为私有 IP 地址
  13. 看到功能应用程序键未加载。
  14. 尝试通过来自 网络或来自 public link.
  15. 看到函数应用网关超时。

通过 SSH 连接到 Function App 并使用 nslookup,我们确定与私有 link 的连接按预期解析了 SQL 数据库的本地 IP 地址。

将 WEBSITE_VNET_ROUTE_ALL 标志设置为 0,nslookup 解析 SQL 数据库的 public IP。

由于 SQL 数据库受到限制且只能在网络上使用,因此将 WEBSITE_VNET_ROUTE_ALL 设置设为 1 至关重要。

WEBSITE_VNET_ROUTE_ALL = 1

WEBSITE_VNET_ROUTE_ALL = 0

参考资料

https://docs.microsoft.com/en-us/azure/app-service/web-sites-integrate-with-vnet

已通过向 Function App 子网添加“Microsoft.Storage”服务端点解决此问题。

当所有流量都发送到 vnet 时,它需要一个到存储的服务端点,以便它可以读取 Function App 配置和功能。

  1. 导航到您的虚拟网络资源
  2. 在侧面菜单的“设置”下,select“服务端点”
  3. 点击“添加”
  4. Select 服务下拉列表中的“Microsoft.Storage”
  5. 根据需要添加政策(我没有在此处 select 任何政策)
  6. 关联Function App子网
  7. 添加。