无法从Azure容器实例连接到Azure SQL数据库

时间:2018-12-14 09:50:00

标签: azure containers azure-sql-database azure-container-instances

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

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

  

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我在ACI中尝试连接到Azure SQL数据库的Windows容器遇到了类似的问题。由于某种原因,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')