【问题标题】:Access Azure SQL from Azure WebApp via Managed Identity and Private EndPoint通过托管标识和专用端点从 Azure WebApp 访问 Azure SQL
【发布时间】:2020-11-18 21:21:30
【问题描述】:

我有一个托管在 Linux Azure WebApp 上的 AspNetCore3.1 应用程序。我已经启用了私有端点。一切都像一个魅力。 现在要添加 DB 交互,我已经为 Web 应用程序启用了系统分配的托管标识 (MI),并将其作为包含的用户添加到我的 Azure SQL PaaS。但是,我在连接数据库时遇到错误:

连接被拒绝,因为拒绝公共网络访问设置为是 (https://docs.microsoft.com/azure/azure-sql/database/connectivity-settings#deny-public-network-access)。 要连接到此服务器,请从您的内部使用专用端点 虚拟网络 (https://docs.microsoft.com/azure/sql-database/sql-database-private-endpoint-overview#how-to-set-up-private-link-for-azure-sql-database)。 在 Microsoft.Data.ProviderBase.DbConnectionPool.CheckPoolBlockingPeriod(异常 e)

也为 SQL DB 配置了 Private Endpoint。这个位于不同的子网中,但与 webapp 的专用终结点所在的 VNet 相同。

-更新:我已验证即使我从 webApp 中删除 Private Endpoint 仍然会引发错误。

我在这里错过了什么?

【问题讨论】:

    标签: azure azure-web-app-service azure-sql-database azure-virtual-network


    【解决方案1】:

    错误消息表明您正尝试从您的 Web 应用程序通过公共网络访问 SQL 服务器。您需要在 VNet 中限制来自 Web 应用程序的传出流量,然后才能为 SQL 服务器使用专用终结点。阅读using Private Endpoints for Azure Web App

    Private Endpoint 仅用于您的 Web 应用程序的传入流。 传出流不会使用此 Private Endpoint,但您可以注入 通过 VNet 传出流到不同子网中的网络 集成功能。

    当您在 SQL Server 中添加专用终结点连接时,您将看到在您为 SQL Server 创建专用终结点的 VNet 中有 Microsoft.Sql 的服务终结点和专用终结点。

    通过专用链接将 Azure Web 应用程序访问到专用网络中的 SQL 服务器。您需要在同一 VNet 的另一个空子网中启用 VNet Integration for your web app。默认情况下,你的应用不能与 Azure DNS 专用区域一起使用。要使用 Azure DNS 专用区域,您需要添加以下应用设置:

    WEBSITE_DNS_SERVER with value 168.63.129.16
    WEBSITE_VNET_ROUTE_ALL with value 1
    

    测试结果在原生 Windows 应用中

    从 web 应用到 SQL db,配置了上述两个应用设置 WEBSITE_DNS_SERVERWEBSITE_VNET_ROUTE_ALL,它解析为私有 IP 地址。

    从 Web 应用到 SQL db,应用设置为 WEBSITE_DNS_SERVER,值为 168.63.129.16,使用私有 DNS 区域且未配置 WEBSITE_VNET_ROUTE_ALL。它解析为公共 IP 地址。

    【讨论】:

    • 所有这些都可以在 Windows Web 应用程序上按预期工作,但是如果我选择 Linux 来托管我的应用程序,它甚至无法加载。 Kudu 控制台没有返回任何结果。我尝试了未找到的名称解析器。 Tcpping 没有返回任何响应。
    • 是的,测试命令在 linux web 应用程序中不起作用,但 vnet 集成执行相同的场景。您可以在同一个 vnet 中部署一个 windows 测试 vm 来验证它。
    • 您好,请注意,您不能在同一个应用服务计划中混合使用 Windows Web 应用和 Linux Web 应用。如果您选择 Linux 来托管您的应用程序,则需要将其部署在另一个服务计划中并将其应用程序集成到新子网中。 Windows 和 Linux 应用程序(包括自定义容器)完全支持区域 vnet 集成功能。 Windows 应用程序和 Linux 应用程序之间的所有行为都相同。一个例外,WEBSITE_VNET_ROUTE_ALL 目前在 Windows 容器中不受支持。
    • 我尝试使用 2 个新的应用服务计划和 2 个单独的子网进行 vnet 集成,但结果不同。与 Windows WebApp 相同的应用程序可以正常工作。另一个带有 Linux 网络应用程序的应用程序在 vnet 集成后甚至无法启动我的应用程序。
    • 当您说与 Windows Web 应用程序相同的应用程序正常工作时,另一个与 Linux Web 应用程序的应用程序失败。您能否在 VNet 集成之前验证 Web 应用程序是否可以启动或正常运行?它看起来像网络应用程序本身的问题。此外,当您通过 Internet 访问此 Web 应用程序时,您应该删除 Web 应用程序 UI 上的私有端点(这会限制对您的 Web 应用程序的公共访问)。
    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 2022-08-02
    • 1970-01-01
    • 2021-04-07
    • 2020-07-03
    • 2022-11-10
    • 2019-01-30
    • 2022-07-04
    相关资源
    最近更新 更多