Доступ к базе данных Cosmos в виртуальной сети из приложения Function - PullRequest
0 голосов
/ 27 февраля 2019

Извиняюсь за длинный пост, но я работаю над этим вопросом несколько дней и, похоже, не могу найти решение.

Ситуация

Я хочу ограничить доступ кБД Cosmos в Azure, поместив ее в виртуальную сеть (VNet) и разрешив доступ только через приложение Function.

Подход

Первая часть проста: создание БД Cosmos и виртуальной сетии настройте конечную точку службы базы данных, как описано здесь .

Подключение приложения Function к виртуальной сети можно выполнить двумя способами.

Использование шлюза

Следуя этому руководству, я настроил свою виртуальную сеть с подсетью шлюза и добавил и настроил VPN-шлюз, как описано.

После этого я добавил подсеть шлюза в базу данных Cosmos.Конфигурация и настройка конечной точки службы. Приложение-функция

Выбор подсети с использованием функции виртуальной сети (предварительный просмотр)

Этот подход проще в настройке, но, как описано в документах Microsoft это нне доступен для рабочих нагрузок.
Конфигурирование проще, но поскольку результаты одинаковы, я оставил эту опцию в оставшейся части этого поста.

Конфигурация

VNet

GatewaySubnet configuration

Шлюз

Point-to-site configuration

Cosmos DB

Cosmos DB Configuration

Приложение функции

Function App VNet configuration

Проблема

У меня постоянно возникают ошибки подключения, когдапытаюсь подключиться к базе данных Cosmos из моего функционального приложения:

{
    "Message": "An error has occurred.",
    "ExceptionMessage": "Unable to proceed with the request. Please check the authorization claims to ensure the required permissions to process the request.\r\nActivityId: f784890f-2e1a-4e36-bfb9-8f62ff32c034, Microsoft.Azure.Documents.Common/2.2.0.0, Windows/10.0.14393 documentdb-netcore-sdk/2.2.2",
    "ExceptionType": "Microsoft.Azure.Documents.DocumentClientException",
    "StackTrace": "   at Microsoft.Azure.Documents.Client.ClientExtensions.ParseResponseAsync(HttpResponseMessage responseMessage, JsonSerializerSettings serializerSettings, Boolean throwOnKnownClientErrorCodes)\r\n   at Microsoft.Azure.Documents.Client.GatewayServiceConfigurationReader.GetDatabaseAccountAsync(Uri serviceEndpoint)\r\n   at Microsoft.Azure.Documents.Routing.GlobalEndpointManager.GetDatabaseAccountFromAnyLocationsAsync(Uri defaultEndpoint, IList`1 locations, Func`2 getDatabaseAccountFn)\r\n   at Microsoft.Azure.Documents.Client.GatewayServiceConfigurationReader.InitializeReaderAsync()\r\n   at Microsoft.Azure.Documents.Client.DocumentClient.InitializeGatewayConfigurationReader()\r\n   at Microsoft.Azure.Documents.Client.DocumentClient.GetInitializationTask()\r\n   at Microsoft.Azure.Documents.Client.DocumentClient.EnsureValidClientAsync()\r\n   at Microsoft.Azure.Documents.Client.DocumentClient.ReadDatabasePrivateAsync(String databaseLink, RequestOptions options, IDocumentClientRetryPolicy retryPolicyInstance)\r\n   at Microsoft.Azure.Documents.BackoffRetryUtility`1.<>c__DisplayClass1_0.<<ExecuteAsync>b__0>d.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at Microsoft.Azure.Documents.BackoffRetryUtility`1.ExecuteRetryAsync(Func`1 callbackMethod, Func`3 callShouldRetry, Func`1 inBackoffAlternateCallbackMethod, TimeSpan minBackoffForInBackoffCallback, CancellationToken cancellationToken, Action`1 preRetryCallback)\r\n   at Microsoft.Azure.Documents.ShouldRetryResult.ThrowIfDoneTrying(ExceptionDispatchInfo capturedException)\r\n   at Microsoft.Azure.Documents.BackoffRetryUtility`1.ExecuteRetryAsync(Func`1 callbackMethod, Func`3 callShouldRetry, Func`1 inBackoffAlternateCallbackMethod, TimeSpan minBackoffForInBackoffCallback, CancellationToken cancellationToken, Action`1 preRetryCallback)\r\n   at Microsoft.Azure.Documents.BackoffRetryUtility`1.ExecuteAsync(Func`1 callbackMethod, IRetryPolicy retryPolicy, CancellationToken cancellationToken, Action`1 preRetryCallback)\r\n   at Microsoft.Azure.Documents.Client.DocumentClient.CreateDatabaseIfNotExistsPrivateAsync(Database database, RequestOptions options)\r\n   at VnetTestFunction.Function1.Run(HttpRequest req, ILogger log) in C:\\Development\\VnetTestFunction\\VnetTestFunction\\Function1.cs:line 39"
}

Нет разницы между подходами.В обоих случаях нет связи между моим функциональным приложением и базой данных.

В качестве теста я следовал этому руководству, добавил виртуальную машину и настроил прокси.Это работает, поэтому приложение Function имеет доступ к виртуальной сети.

Мне кажется, что это где-то проблема с конфигурацией, но я не могу найти где.Я продолжу поиск, но любая помощь будет высоко оценена.

Использованные онлайн-ресурсы

1 Ответ

0 голосов
/ 28 февраля 2019

Я считаю, что ваша конфигурация правильная, так как оба подхода не должны работать так, как вы хотите.

Для Функция интеграции с VNet , вы можете использовать этот шлюз для безопасного доступа к ресурсам в виртуальной сети.

VNet Integration предоставляет вашему веб-приложению (или функциональному приложению) доступ к ресурсам вашей виртуальной сети, но не предоставляет частный доступ к вашему веб-приложению из виртуальной сети.

Кроме того, Cosmos DB не является ресурсом внутри Azure VNet, фактически вы не ограничивали доступ из функции Azure к Cosmos DB с помощью этого метода.Ваше приложение Function подключено как к Интернету, так и к вашей VNET.Он по-прежнему работает из приложения Function в Cosmos DB через Интернет.

Кроме того, после включения конечной точки службы Cosmos DB в определенной подсети это действительно ограничивает доступ к учетной записи Azure Cosmos DB с подключениями из этой авторизованной подсети.в виртуальной сети.Если вы настраиваете только авторизованную подсеть в брандмауэре Cosmos DB, я думаю, что только запрос из авторизованной подсети может обойти брандмауэр.В этом случае функция Azure также не является ресурсом в авторизованной подсети.

Когда вы добавляете виртуальную машину в виртуальную сеть Azure и настраиваете прокси-сервер после процесса интеграции приложения-функции с AzureВиртуальная сеть .В этом сценарии виртуальные машины представляют собой ресурсы, развернутые в виртуальной сети Azure.Таким образом, вы можете получить к нему доступ в частной виртуальной сети с помощью функций интеграции с виртуальной сетью.

Насколько я знаю, если вы хотите использовать приложение-функцию Azure в виртуальной сети, вы можете развернуть службу приложения в службе приложений.Среды , в которых служба приложений Azure развертывается непосредственно в виртуальной сети Azure.Конечно, это очень масштабно и дорого.

...