1

我用我的应用程序构建了一个 Windows 容器并在本地运行它。容器中的应用使用连接字符串中的域名连接到 Azure SQL 数据库。SQL Server 配置为接受来自任何 IP 和 Azure 服务的客户端。

在本地一切正常。但是当我在 Azure 容器实例中运行我的容器时,我收到以下标准错误:

建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:TCP Provider,错误:0 - 连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应。)

4

2 回答 2

1

您需要创建一个托管标识https://docs.microsoft.com/en-us/azure/container-instances/container-instances-managed-identity并将该标识权限授予 SQL 数据库。

然后,您可以使用 Microsoft.Azure.Services.AppAuthentication 库获取访问令牌并在身份验证期间使用它。这仅在 dotnetcore 2.2 和 .net 4.6 及更高版本中可用。

string connectionString = "Data Source=<AZURE-SQL-SERVERNAME>; Initial Catalog=<DATABASE>;";
SqlConnection conn = new SqlConnection(connectionString);
conn.AccessToken = (new AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net/").Result;
conn.Open();

更多信息可以在下面的链接中找到。它们都不是针对 ACI 的,但是一旦您创建了 MSI,从代码的角度来看,它们应该基本相同。

https://docs.microsoft.com/en-us/azure/key-vault/service-to-service-authentication https://docs.microsoft.com/en-us/azure/active-directory/managed-identities -azure-resources/tutorial-windows-vm-access-sql https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-connect-msi

于 2018-12-14T14:32:33.373 回答
0

我在 ACI 中尝试连接到 Azure SQL 数据库时遇到了类似的问题。出于某种原因,DNS 在容器内无法正常工作。我无法解析任何公共 DNS 名称。在容器内部,DNS 被指向一个10.x.x.x地址。我从未将其设置为映像构建的一部分,因此我假设 ACI 将其设置为 DHCP 的一部分。

为了解决这个问题,我在我的 PowerShell 入口点脚本中运行了以下命令:

$nic = Get-NetAdapter
Set-DnsClientServerAddress -InterfaceIndex $nic.IfIndex -ServerAddresses ('1.1.1.1','8.8.8.8')
于 2019-04-25T06:36:00.377 回答