【发布时间】:2019-07-20 21:55:02
【问题描述】:
为这篇长文道歉,但我已经在这个问题上工作了好几天,但似乎找不到解决方案。
情况
我想通过将 Cosmos DB 放置在虚拟网络 (VNet) 中来限制对 Azure 中的 Cosmos DB 的访问,并且只允许通过函数应用进行访问。
方法
第一部分很简单:创建一个 Cosmos DB 和一个 VNet,并按照here 的描述配置数据库的服务端点。
可以通过两种方式将函数应用连接到 VNet。
使用网关
按照this 指南,我已经为我的 VNet 配置了一个网关子网,并按照说明添加和配置了一个 VPN 网关。
之后,我将网关子网添加到 Cosmos DB 服务端点配置并设置我的 Function App
使用 VNet(预览)功能选择子网
这种方法更容易设置,但如 microsoft docs 中所述,它不适用于生产工作负载。
配置更简单,但由于结果相同,我在本文的其余部分省略了此选项。
配置
VNet
网关
宇宙数据库
功能应用
问题
尝试从我的函数应用连接到 Cosmos DB 时,我不断收到连接错误:
{
"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"
}
这两种方法没有区别。在这两种情况下,我的函数应用和数据库之间都没有连接。
作为测试,我按照this 教程添加了一个虚拟机并设置了一个代理。这可行,因此函数应用可以访问 VNet。
我的直觉说这是某个地方的一些配置问题,但我无法找出哪里。我会继续搜索,但非常感谢任何帮助。
使用的在线资源
【问题讨论】:
标签: azure-functions azure-cosmosdb azure-virtual-network