Извиняюсь за длинный пост, но я работаю над этим вопросом несколько дней и, похоже, не могу найти решение.
Ситуация
Я хочу ограничить доступ кБД Cosmos в Azure, поместив ее в виртуальную сеть (VNet) и разрешив доступ только через приложение Function.
Подход
Первая часть проста: создание БД Cosmos и виртуальной сетии настройте конечную точку службы базы данных, как описано здесь .
Подключение приложения Function к виртуальной сети можно выполнить двумя способами.
Использование шлюза
Следуя этому руководству, я настроил свою виртуальную сеть с подсетью шлюза и добавил и настроил VPN-шлюз, как описано.
После этого я добавил подсеть шлюза в базу данных Cosmos.Конфигурация и настройка конечной точки службы. Приложение-функция
Выбор подсети с использованием функции виртуальной сети (предварительный просмотр)
Этот подход проще в настройке, но, как описано в документах Microsoft это нне доступен для рабочих нагрузок.
Конфигурирование проще, но поскольку результаты одинаковы, я оставил эту опцию в оставшейся части этого поста.
Конфигурация
VNet
Шлюз
Cosmos DB
Приложение функции
Проблема
У меня постоянно возникают ошибки подключения, когдапытаюсь подключиться к базе данных 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 имеет доступ к виртуальной сети.
Мне кажется, что это где-то проблема с конфигурацией, но я не могу найти где.Я продолжу поиск, но любая помощь будет высоко оценена.
Использованные онлайн-ресурсы