Не удается подключиться к базе данных SQL Azure из экземпляров контейнера Azure - PullRequest
0 голосов
/ 14 декабря 2018

Я создал контейнер Windows с моим приложением внутри и запустил его локально.Приложение в контейнере подключается к базе данных SQL Azure, используя имя домена из строки подключения.SQL Server настроен на прием клиентов с любого IP-адреса и из служб Azure.

Все отлично работает локально.Но когда я запускаю свой контейнер в экземплярах контейнера Azure, я получаю следующую стандартную ошибку:

При установке соединения с SQL Server произошла ошибка, связанная с сетью или экземпляром.Сервер не найден или не был доступен.Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений.(поставщик: поставщик TCP, ошибка: 0 - попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, поскольку подключенный хост не смог ответить.)

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

У меня возникла похожая проблема с контейнером Windows в ACI, который пытался подключиться к базе данных SQL Azure.По какой-то причине 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')
0 голосов
/ 14 декабря 2018

Вам необходимо создать управляемый идентификатор 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

...