专用 vNet 中的 Azure Functions v4 无法连接到 Azure Sql

问题描述 投票:0回答:1

我已经阅读了几篇文章和帖子,但无法让我的 v4 Functions 应用程序连接到我的 azure sql 服务器。我在另一个 vnet 中有一个常规 Web 应用程序,可以直接访问数据库,无需额外配置。

这是我的 vNet 配置:

互联网络:10.0.0.0/24
DMZ 子网:10.0.0.0/27
Web 应用程序集成子网:10.0.0.32/29(此应用程序连接到对等 vnet 中的 api)
存储子网:10.0.0.40/29
功能应用集成子网:10.0.0.48/29
资源子网:10.0.0.64/27

我的 Function 应用程序已设置,因此传入流量通过 DMZ,并且 vNet 集成通过集成子网。

对于我的 vNet 集成,我启用了以下选项:

  • 出站互联网流量
  • 内容存储

集成子网添加了服务端点:

  • 微软.Sql
  • 微软存储

我在 vNet 中拥有指向我的安全存储的 privatelink.blob.core.windows.net 和 privatelink.file.core.windows.net 的专用 DNS 区域。

我的 Sql Server 实例具有针对 Function App 集成子网的虚拟网络规则

我的连接字符串(适用于其他应用程序)是这样的:

服务器=tcp:mydb.database.windows.net,1433;数据库=MyDatabase;用户ID=;身份验证=Active Directory管理身份;MultipleActiveResultSets=True;应用程序=MyFunction

其中

<Managed Ident Client Id>
是用户分配的托管身份的客户端 ID。我们在所有应用程序服务中使用这种连接,并且在其他地方运行良好。

相关功能App配置:

  • AzureWebJobsStorage 已删除
  • AzureWebJobsStorage__帐户名称 =
  • AzureWebJobsStorage__credential = 托管身份
  • AzureWebJobsStorage__clientId =
  • WEBSITE_CONTENTOVERVNET = 1
  • WEBSITE_VNET_ROUTE_ALL = 1

AzureWebJobsStorage
的覆盖让我可以使用用户分配的托管标识连接到存储。在我进行设置之前,以下运行状况检查将因 grpc 错误而失败。

在我的函数应用程序中,我有一个基本的健康检查,如下所示:

[Function(FunctionConstants.HealthCheck.Basic)]
public async Task<HttpResponseData> BasicHealthCheckAsync([HttpTrigger(AuthorizationLevel.Admin, "post", Route = "health-check/basic")]
    HttpRequestData request, FunctionContext context)
{
    var logger = context.GetLogger<HealthCheckHttpActivator>();

    logger.LogTrace("Request made to basic health check");

    var response = request.CreateResponse(HttpStatusCode.OK);

    await response.WriteAsJsonAsync(new
    {
        ServerTimeUtc = DateTime.UtcNow
    });

    return response;
}

此端点工作正常并运行。

我有另一个端点用于验证与数据库的连接,这会引发此错误:

建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供程序:命名管道提供程序,错误:40 - 无法打开与 SQL Server 的连接)

此错误在我添加服务端点之前开始。根据一些文章和帖子建议添加,所以我这样做了。但是,我的函数应用程序仍然无法连接。

使用我的函数应用程序上的控制台,我可以运行此命令并获得成功:

tcpping mydb.database.windows.net:1433

所以我很困惑为什么控制台可以工作,但功能应用程序本身无法解析到数据库 - 特别是当另一个 vnet 上的常规应用程序服务类似地设置可以开箱即用时。

azure-functions azure-sql-database azure-virtual-network azure-managed-identity
1个回答
0
投票

请参阅我的 SO 答案,以成功启用 Azure Function App 和 Azure SQL 之间的 VNET 集成。我已在答案中将 Azure Web 应用程序与 Azure SQL 集成。

我创建了一个具有 2 个子网的 VNET:- default 和 default2,并添加了 2 个服务端点,

Microsoft.Web
Microsoft.Sql
:-

enter image description here

enter image description here

我在 Azure Functions 网络入站规则中允许 VNET + 默认子网:-

enter image description here

我在 Azure SQL 网络 > 选定网络中允许 VNET + default2 子网,并选中允许 Azure 服务和资源访问此服务器:-

enter image description here

enter image description here

即使您的 VNET 是对等互连且子网位于不同的 VNET 中,此配置也将起作用。

此外,在资源组或订阅级别添加您的 Function App 至少托管贡献者角色,以便正确连接到 Azure SQL。

© www.soinside.com 2019 - 2024. All rights reserved.