我已经阅读了几篇文章和帖子,但无法让我的 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 集成,我启用了以下选项:
集成子网添加了服务端点:
我在 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
的覆盖让我可以使用用户分配的托管标识连接到存储。在我进行设置之前,以下运行状况检查将因 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 上的常规应用程序服务类似地设置可以开箱即用时。
请参阅我的 SO 答案,以成功启用 Azure Function App 和 Azure SQL 之间的 VNET 集成。我已在答案中将 Azure Web 应用程序与 Azure SQL 集成。
我创建了一个具有 2 个子网的 VNET:- default 和 default2,并添加了 2 个服务端点,
Microsoft.Web
和 Microsoft.Sql
:-
我在 Azure Functions 网络入站规则中允许 VNET + 默认子网:-
我在 Azure SQL 网络 > 选定网络中允许 VNET + default2 子网,并选中允许 Azure 服务和资源访问此服务器:-
即使您的 VNET 是对等互连且子网位于不同的 VNET 中,此配置也将起作用。
此外,在资源组或订阅级别添加您的 Function App 至少托管贡献者角色,以便正确连接到 Azure SQL。