从Function应用程序访问虚拟网络中的Cosmos DB

问题描述 投票:0回答:1

为这篇长篇文章道歉,但我已经在这个问题上工作了几天,我似乎无法找到解决方案。

情况

我希望通过将其置于虚拟网络(VNet)中来限制对Azure中的Cosmos DB的访问,并且仅允许通过Function应用程序进行访问。

途径

第一部分很简单:创建一个Cosmos DB和一个VNet,并按照here的描述配置数据库的服务端点。

将功能应用程序连接到VNet可以通过两种方式完成。

Using a Gateway

this指南之后,我已经为我的VNet配置了一个网关子网,并按照描述添加和配置了VPN网关。

之后,我将网关子网添加到Cosmos DB服务端点配置并设置我的功能应用程序

Choosing a subnet using the VNet (preview) functionality

这种方法更容易设置,但正如microsoft docs中所述,它不适用于生产工作负载。 配置更容易,但由于结果相同,我在本文的其余部分省略了此选项。

组态

VNet

GatewaySubnet configuration

Gateway

Point-to-site configuration

Cosmos DB

Cosmos DB Configuration

Function App

Function App VNet configuration

问题

尝试从我的功能应用程序连接到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教程并添加了一个VM并设置了一个代理。这有效,因此Function应用程序可以访问VNet。

我的直觉是,这是某个配置问题,但我无法找到原因。我会继续搜索,但非常感谢任何帮助。

使用在线资源

azure-functions azure-cosmosdb azure-virtual-network
1个回答
2
投票

我相信您的配置是正确的,因为这两种方法都不能按您的意愿工作。

对于VNet Integration feature,您可以使用此网关安全地访问VNet中的资源。

VNet Integration使您的Web应用程序(或功能应用程序)可以访问虚拟网络中的资源,但不会从虚拟网络授予对Web应用程序的私有访问权限。

此外,Cosmos DB不是Azure VNet中的资源,实际上您并未使用此方法限制从Azure功能到Cosmos DB的访问。您的功能应用程序已连接到Internet和VNET。它仍然可以通过Internet从Function App到Cosmos DB。

此外,一旦在特定子网中启用了Cosmos DB服务端点,这确实限制了对来自虚拟网络中此授权子网的连接的Azure Cosmos DB帐户的访问。如果您只在Cosmos DB的防火墙中配置授权子网,我认为只有来自授权子网的请求才能绕过防火墙。在这种情况下,Azure功能也不是授权子网中的资源。

在Azure VNet中添加VM并在integrating a Function App with an Azure Virtual Network的过程之后设置代理。在此方案中,VM是Azure VNet中部署的资源。因此,您可以使用VNet集成功能在专用VNet中访问它。

据我所知,如果您希望在VNet中使用Azure功能应用程序,则可以在App Service Environments中部署应用程序服务,该服务将Azure App Service直接部署到Azure虚拟网络中。当然,这是一个非常高的规模和成本。

© www.soinside.com 2019 - 2024. All rights reserved.