Azure-docs: 不清楚是否/如何允许App Service访问只能从vnet访问的资源(CosmosDB)

创建于 2019-04-01  ·  53评论  ·  资料来源: MicrosoftDocs/azure-docs

(我不确定这是App Service还是Cosmos DB文档问题;这是App Service文档票证上的一个交叉表)

此问题与Stackoverflow上的

从我要从中创建此问题的文档页面以及与VNet相关的Cosmos DB文档页面,我不清楚是否支持以下方案。

我有一个应用程序服务和一个Cosmos数据库。 我想限制对Cosmos DB的访问-只有App Service可以访问它。

我的解决方案是:

  • 用一个名为default子网创建一个vnet
  • 在Cosmos DB中启用防火墙功能->设置Allow access from Selected networks
  • default子网中为Cosmos DB创建服务端点
  • 在App Service中应用New VNet integration并将其连接到相同的default子网

Cosmos DB防火墙设置:
image

default子网设置:
image

不幸的是,这不起作用。 如何使App Service通过VNet正确访问Cosmos DB?


文件详细资料

请勿编辑此部分。

Pri2 assigned-to-author cosmos-dsvc product-question triaged

最有用的评论

我实际上不认为您列出的有关vnet限制的文档是指新的vnet集成。 观看来自MS Ignite 2018的视频。相关位从10分钟左右开始。
https://azure.microsoft.com/zh-cn/resources/videos/ignite-2018-what-is-new-in-azure-app-service-networking/

这是屏幕截图。
image

看来我们正在尝试做的事情应该受到支持。

所有53条评论

@hansmbakker感谢您详细介绍所遇到的问题,您是说在"My solution was to:"详述的4个步骤仍然导致以下语句"Unfortunately, this does not work. How do I make the App Service correctly access Cosmos DB through the VNet?"吗?

或者,您按照4个步骤(详细说明)进行了操作,但是按照文档进行操作不起作用?

如果您完全陷入困境,而您的解决方案根本不起作用,我怀疑您需要将App Service的特定源地址添加到Cosmos DB防火墙Allow IP Address列表中。 我确实需要更仔细地研究以了解文档,并确定需要进行的任何更正,但确实希望建议您这样做。 请参阅以下与App Service IP寻址有关的文档:

Azure App Service中的入站和出站IP地址
如何确定Azure应用服务的出站IP地址
如何确定Azure托管的WebApp的IP地址

@ Mike-Ubezzi-MSFT感谢您的回复。

解决方案的4个步骤(+将开发机的IP列入白名单)后,它不起作用。

所以我要问的是:

  • 这个解决方案应该起作用吗?
  • 要进行这项工作,我需要更改一些内容吗?

我在文档中找不到这两个问题的答案。

我不愿意将IP地址从应用程序服务中列入白名单的原因是,我相信不能保证该IP地址是固定的。

@hansmbakker您需要订阅App Service Environment才能获得静态IP功能。 App Service本身不允许使用专用IP地址。 因此,您可以使用Allow access to Azure services允许流量访问您的Cosmos实例,或建立特定IP地址的白名单...或使用VNet。 您针对此问题提交的文档是“常见问题解答”页面,但未解决您的特定问题。 本文档将引导您完成为Cosmos数据库实例部署/配置VNet的特定配置步骤。

@ Mike-Ubezzi-MSFT您是说没有应用服务环境(ASE),就不可能实现我的方案/解决方案吗?

如果是这样的话

  • VNET集成允许从App Service到VNET的访问
  • CosmosDB VNET服务端点允许从VNET访问CosmosDB
  • CosmosDB可以将访问限制为来自VNET的流量

那为什么我不能通过VNet路由App Service-> CosmosDB通信呢?

我不明白普通App Service的(新)VNet集成的目的是什么?

@hansmbakker要让应用程序服务访问Cosmos DB,您应该选中“接受来自Azure数据中心的连接”选项,如下屏幕所示:

image

可从Azure数据中心IP范围访问Azure Cosmos DB帐户。 这样就可以使用IP地址无法固定的搜索,数据工厂,流分析等服务与Cosmos DB帐户进行通信。

@SnehaGunda我知道这将允许App Service访问CosmosDB实例。 但是,我使用您推荐的选项,然后Azure中的任何随机App Service或其他组件都可以访问CosmosDB实例。

这与这个故事背后的原因不符-IT部门提出了开篇中提到的方法,他们要求在我们的体系结构中进行此设置,以仅允许该App Service访问CosmosDB实例。

现在,这个GitHub问题的重点是

  • 验证公司IT部门所需的方法
  • 检查我是否正确理解App Service和CosmosDB的VNet集成

因此,我要求反馈

@hansmbakker南希·熊(Nancy Xiong)提供的Stack Overflow答案已经出现。 如果在App Service环境中部署应用程序层,则将获得真正的VNet功能。 Nancy在Stack Overflow答案中指出,使用多用户环境不能完全支持仅VNet访问。

Deloitte撰写了一篇文章,提供并概述了多租户应用程序服务实例和App Service Environment实例之间的比较:何时使用Azure App Service环境v2(隔离的App Service)

仅私人访问?

多租户环境:

应用服务始终可以通过公共互联网访问。
限制对App Service的访问的一种方法是使用IP和域限制,但仍可以从Internet上访问App Service。

应用服务隔离/应用服务环境v2:

ASE可以与内部负载均衡器一起部署,该负载均衡器将锁定您的App Services,使其只能从您的VNET内部或通过ExpressRoute或站点到站点VPN进行访问。

@ Mike-Ubezzi-MSFT我知道ASE可用于限制对App Service的访问。 但是,这不是我要实现的目标。

我正在尝试让App Service访问通过VNet路由的另一个资源(在本例中为Cosmos DB,但还有Blob存储)。 我以为可以使用(新的)VNet集成。

我的问题之一是App Service的VNet集成的目的是什么?

@hansmbakker最初启动该服务时,VNet集成功能的意图具有以下要求:

对于Azure App Service,新版本的VNet集成功能允许跨服务端点或Azure ExpressRoute连接访问资源。
像早期版本一样,新的VNet集成功能仅使您的应用能够向虚拟网络发出呼叫。 它不会影响应用程序的入站流量。
此功能在所有公共区域中都处于预览状态。 具有以下特点:

(项目清单)

  • 您的App Service计划必须是Standard,Premium或Premium V2计划。
  • 您的应用程序必须位于能够扩展到Premium v​​2的Azure App Service部署中。
  • 该功能当前仅适用于Windows应用程序。
  • 新功能要求Azure资源管理器虚拟网络中有未使用的子网。
  • 应用程序和虚拟网络必须位于同一区域。

宣布App Service中的新VNet集成功能

因此,它旨在与VNet集成,并在Express Route连接或其他对等网络上扩展(前端)服务,以将应用程序服务调用转换为虚拟网络。

您试图做的是确保App Service通过直接连接或REST与Cosmos数据库实例建立的通信安全。

并不是说您的方法无效,而是集成服务不是这里的解决方案。

我已经验证了服务端点似乎也不适用于Key Vault和Blob存储,尽管此页面上的最后一段明确指出:

新的VNet集成功能使您可以使用服务端点。 要将服务端点与您的应用程序一起使用,请使用新的VNet集成连接到选定的VNet,然后在用于集成的子网上配置服务端点。

我已经完全按照OP设置了我的应用程序服务,但是出现“未授权”错误。 当我禁用密钥库/ blob存储帐户的VNET限制时,它可以正常工作。

感谢您提供其他详细信息! 我已将问题分配给内容作者,以进行适当的评估和更新。

@ Mike-Ubezzi-MSFT

https://github.com/MicrosoftDocs/azure-docs/issues/28461#issuecomment -479586153它旨在(...)用于将应用程序服务调用到虚拟网络中

这正是我正在尝试的方法:将来自应用程序服务的调用通过vnet路由到也连接到vnet的服务端点

app service --> vnet --> service endpoint --> cosmosdb

集成服务不是这里的解决方案

这就是我困惑的地方。 从第一个引用看来,它可以/应该工作,但是从第二个引用看来,它不能工作。

那要走什么路呢?

我已将问题分配给内容作者,以进行适当的评估和更新。

谢谢!

@hansmbakker它与入站连接与出站连接有关,并使用站点到站点/点对站点VPN和Express Route方案来创建私有寻址,以在内部扩展到Azure的情况下VNet服务端点是私有的。 VNet到VNet的集成不一定是您要实现的。 我同意需要对文档进行增强以使内容更清楚,但是MSDN和Stack Overflow论坛中有一些讨论此问题的线程:

应用程序服务和VNet到VNet的连接
添加vnet集成后无法访问应用程序服务网站

我认为该文档是否具有受支持/不受支持的方案图,以帮助提炼利用VNet服务端点(公共和私有)与VNet集成之间的差异。

另请注意,“ App Service VNet集成”页面建议App Service可以使用VNet集成通过VNet访问其他服务。

image

上方屏幕快照中的“了解更多”链接指向https://docs.microsoft.com/zh-cn/azure/app-service/web-sites-integrate-with-vnet。

该页面上的“新VNet集成”(我正在使用)部分显示:

您可以使用新的VNet集成功能消耗服务端点保护的资源。 为此,请在用于VNet集成的子网上启用服务端点。

对于它的价值,我偶然发现了这个问题,因为我得出了与@hansmbakker相同的结论,并试图在概念验证中实现新的(预览)vnet集成。

我的用例是到Azure SQL Server而不是CosmosDB的App Service。 我至少能够找到这种情况,实际上是在此处的“限制”部分中列出的: https :

建议使用这些功能的推荐步骤是什么? 在我遇到的所有问题和文章中,通常每个人的目的都是消除将“允许访问Azure服务”保持在“打开”位置的需求。 以我的拙见,这应该是CosmosDB和Azure SQL Server等数据存储服务的即开即用功能。

我实际上不认为您列出的有关vnet限制的文档是指新的vnet集成。 观看来自MS Ignite 2018的视频。相关位从10分钟左右开始。
https://azure.microsoft.com/zh-cn/resources/videos/ignite-2018-what-is-new-in-azure-app-service-networking/

这是屏幕截图。
image

看来我们正在尝试做的事情应该受到支持。

很好发现,@ NateB2!

在我看来,它也与我们正在尝试做的事情相符。 我在Azure存储方面遇到同样的问题,顺便说一句。

您是否通过电子邮件获得了任何脱机支持?

为此,至少我没有发疯……很高兴其他人也在尝试这样做。 找到此反馈项: https :

@ccompy ,能否请您介绍一下我们遇到的这个问题?

@ NateB2共享的视频中(我相信您正在演示中),看起来SQL Server与应用程序服务位于不同的子网中:

  • SQL似乎仅限于IP地址范围10.0.9.0/27的子网vnetint-demo-subnet 10.0.9.0/27 (请参见视频中的15:18)
  • VNet集成子网看起来已连接到IP地址范围10.0.1.0-10.0.1.31子网networking-demosubnet 10.0.1.0-10.0.1.31 (请参阅视频中的15:23)

您能否解释一下正在运行1个或2个子网?

  • 您能解释一下我应该如何拿Requires an unused subnet吗?
  • 是否应该设置2个子网,1个用于vnet集成,1个用于服务端点,并带有一些特殊的路由设置?
  • 12:33的图像使其看起来像1个子网就足以完成整个设置

我不仅希望将其用于SQL,还希望将其用于CosmosDB和Azure存储。

我了解这是一个文档问题页面-您能否让我们知道我们在哪些方面可以最好地与合适的人员一起找出正在发生的事情?

添加其他参考信息,这是我之前错过的关键细节:

使用服务端点,子网中用于服务流量的虚拟机的源IP地址从使用公用IPv4地址切换为使用专用IPv4地址。 使用Azure公共IP地址的现有Azure服务防火墙规则将停止与此开关一起使用。 在设置服务终结点之前,请确保Azure服务防火墙规则允许此切换。 在配置服务端点时,您可能还会遇到暂时中断来自此子网的服务流量的情况。 (摘自:将Azure服务保护到虚拟网络

我假设PaaS服务也是如此,例如Azure SQL数据库和Cosmos DB?

@hansmbakker我在堆栈溢出线程中(与屏幕截图有关)看到,您已禁用“允许访问Azure服务”(这是所需的状态),但是在该

此外,如果希望范围包括特定数据中心但小于允许从整个Azure内部网络进行访问,则可以为给定数据中心添加私有IP范围:
Microsoft Azure数据中心IP范围

@SaltyDH您引用的反馈项与App Services有关,而不与App Service环境有关。 App Services是集群体系结构,仅通过网关通过公共IP提供服务。 基于此以及上一个评论中的问题,当您为PaaS服务(例如App Service)启用服务端点时,公用IP不会像使用IaaS服务那样转换为私有IP。

需要将应用程序部署到Azure App Service环境

Azure App Service环境是一项Azure App Service功能,它提供了一个完全隔离的专用环境,用于大规模安全地运行App Service应用程序。

App Service环境(ASE)适用于需要以下条件的应用程序工作负载:

  • 规模很高。
  • 隔离和安全的网络访问。
  • 高内存利用率。

如果您部署应用程序服务环境并添加Cosmos DB VNet服务终结点,并且您的应用程序调用Cosmos DB API,则我唯一想解决的问题是……是否可以通过Azure DNS转换为公共IP或私有IP,并将流量究竟是通过Azure内联网还是通过Internet路由?

@麦克- Ubezzi-MSFT如果你看一下从视频幻灯片我张贴和/或听讲解,它看起来像新的vnet整合并不需要建立一个网关(除非是做幕后)和应用服务的点对点连接。 讨论似乎是关于常规应用程序服务,而不是ASE。 旧的VNET集成确实需要网关和点对点VPN连接,因此,服务端点不可用。

ASE不是我们的选择,因为每月的成本非常高,而且设置它们需要很长的部署时间。

@hansmbakker我正在逐步努力获得Azure支持。 我们通过了CSP,因此还有很多困难需要克服。

谢谢Mike,我非常渴望找到适用于应用程序服务的解决方案,因此切换到应用程序服务环境非常昂贵,因此这不是一个合理的解决方案。 虽然我知道从技术上讲可能很难做到这一点,但我感到困惑,因为似乎朝着这个方向努力,我们正在努力对此进行澄清。

很抱歉在该主题上进行的精彩对话引起的延迟回复。 启用“允许从Azure门户访问”后,可以从Azure数据中心IP范围访问Azure Cosmos DB帐户。 这样就可以使用IP地址无法固定的搜索,数据工厂,流分析等服务与Cosmos DB帐户进行通信。

就您的观点,我认为当前您无法允许特定服务(例如App服务)使用Cosmos DB。 我正在与团队联系以确认是否正确。

您也可以联系[email protected]别名,更多的读者可以看一下您的问题。 抱歉,重定向。 收到回复后,我会回应。

@ccompy呈现的视频中,我没有看到类似的要求。 所以我假设:

  • @ Mike-Ubezzi-MSFT不需要额外的带有来自VNet的私有IP地址的防火墙规则(您可以在cosmosdb防火墙设置中选择允许访问例如cosmosdb的VNet子网,因此无需一次手动添加IP地址更多手动)
  • @SnehaGunda Allow access from Azure portal可以工作,但这不能达到限制访问VNet的目的。

@ Mike-Ubezzi-MSFT @SnehaGunda您看过引用的视频吗? 我相信它将向您展示我们正在努力实现的目标以及为何感到困惑。 如果@ccompy可以在这里发表评论,那将真的很有帮助,因为这似乎是她的话题。

我从cosmos DB团队得到了一个确认,即“当前在使用VNet时我们无法允许特定的服务访问cosmos DB”如果网络团队启用了Cosmos DB可以支持的功能,这是网络端的限制。

@ Mike-Ubezzi-MSFT是否要将此问题重定向到App服务类别? 可能是他们参考影片时有更好的背景

这似乎是一种产品增强功能,并不一定是文档问题。 问题是将“允许访问Azure服务”配置的范围限制或缩小到特定服务或特定服务实例的范围。 我强烈建议阅读此线程的每个人都转至Azure网络用户语音,并提供有关以下特定建议的反馈:访问Azure服务的限制或转到此链接并通读,支持和评论那些相关建议。 您也可以向Azure Web AppsCosmos DB uservoice论坛提出相同的建议,但是它们都使用相同的Azure网络服务。

当前唯一可行的方法是通过App Service Environments,因为ASE是与Azure VNet Service Endpoint集成的唯一方法。

Screenshot (406)

我看到此工作的唯一其他方式是使用App Services当前可用的Hybrid Connections功能,但是由于这需要TCP连接,因此它仅适用于支持directtcp Cosmos DB API实例。

Screenshot (404)

关于视频,当前的VNet集成功能是点对点VPN用例。

视频中的7:00分钟, @ ccompy讨论了新的VNet集成。 我相信这是您想要的功能。 我正在寻找GA日期信息。 此新的VNet集成功能应在几个位置进行预览。 请参阅: Azure App Service的新虚拟网络集成功能正在预览中

45分钟的演示中讨论了很多很棒的东西,例如Windows(不是Linux)支持的新VNet集成功能以及一些服务层要求。 如果有我没有涉及的特定内容,请在此处分享。 谢谢!

@ Mike-Ubezzi-MSFT感谢您的详尽回答。

视频中的7:00分钟, @ ccompy讨论了新的VNet集成。 我相信这是您想要的功能。

是的,这正是我想要的,并且我已经在使用新的VNet集成(请在开头的帖子中查看我的复制步骤)。 我尝试按照提供的@ccompy进行设置,但是它没有按预期工作。

@ NateB2在#28805中具有相同的问题。

我了解它仍处于预览阶段,但是我们如何才能最好地合作提出此问题? @ccompy是否有可能在这里发表评论?

FWIW,周一,我与App Service团队的支持工程师进行了电话/远程桌面共享会议,他似乎表明,新的Vnet集成预览版可以实现我们正在尝试做的事情。 对话结束时,我向他展示了我们设置的内容后,他说他将在自己身边进行复制,并与团队协商以了解发生了什么。

@ NateB2他们能够复制它吗?

@hansmbakker-是的,他们说它尚未实现,但是要在新的VNET集成到达GA之前实现。 但是,他们没有给出时间表。

@hansmbakker感谢您提出这一要求,自那时以来您是否取得了进展? 您是否已尝试将ServiceEndpoint的两个子网方案和Vnet的一个子网方案尝试过?

已经超过2个月了,对于他们自2018年以来在视频和更新的网站中提出的声明,现在应该可以使用!

@ sarah026今天您问这个问题是一个巧合,因为我两个小时前才成功使用CosmosDB。

我必须要做的事情才能使其生效:

  • 删除现有的VNET(包括子网,CosmosDB和其他服务端点,VNET集成)
  • 重新创建带有子网的VNET。 使用服务端点使用其“防火墙/网络”选项卡集成CosmosDB。
  • 在App Service中再次设置新的VNET集成(如果使用ARM模板执行此操作,请注意与旧VNET集成不同的语法!为此,请在App Service中使用

vnet中不需要两个子网,一个子网就足够了。 新VNET集成和CosmosDB服务端点连接到同一子网。

这使它对我来说适用于CosmosDB,但是Azure存储对我而言仍然无法使用相同的方法。

很高兴听到@hansmbakker! 感谢分享。 我们的环境是昨天建立的,因此是新建的。
您的服务部署到哪个地理位置?

西欧,希望它也对您有用。

App Services和SQL Azure遇到相同的问题,这似乎不起作用,因为文档和其他各种演示均指出:

https://www.youtube.com/watch?v=wWX5iTQPp5M

https://www.youtube.com/watch?v=ic6Laiv9Jfc

App Services和SQL Azure遇到相同的问题,这似乎不起作用,因为文档和其他各种演示均指出:

https://www.youtube.com/watch?v=wWX5iTQPp5M

https://www.youtube.com/watch?v=ic6Laiv9Jfc

我的现在在AppService和SQL elasticpool之间运行良好。 我建议你和他们一起卖票。 我的问题是数据中心级别的问题,他们需要将某些事情列入白名单才能使其正常工作。 并不是我们做错了什么,所以我不建议您浪费我浪费的时间来解决这个问题。
这也是西欧盟地区! 为什么它对hansmbakker而不对我们有用!

会的,谢谢@ sarah026的建议

在Web应用程序和cosmos表之间运行。 不确定是什么使它起作用,但是删除资源并重新添加它们花了几个小时。 可能只是解决问题的时间,规定等?

删除和重新创建也“神秘地”解决了我的问题。

在发现最初配置的服务器不支持扩展到P1V2之后,我尝试了这条路线。 在某些文档中已经引用了它,但是我没有意识到的是,这意味着我的SPECIFIC服务器可能禁用了缩放选项(确实如此),并且这表明存在单独的缺陷,这将阻止该VNet解决方案加工。

我认为发生的事情是我在一个旧机架中分配了计算资源,这可能是因为我是从一个免费试用帐户中将该服务器转发来的(即使还不到2个月前)。 需求/结果很难关联,这是一个使我的VNet无法正常工作的不可见线程。

我没有意识到在同一计划中位于同一计算位置的两台服务器,其中一台可能支持扩展,而另一台则不支持。 当我观看上面发布的youtube视频时,这终于使我明白了他们的意思。

所以我仍然遇到这个问题。 另外,是否已经发布了新的VNET集成?

我执行的步骤:

  1. 创建一个VNet
  2. 我默认保留子网
    image
  3. 设置宇宙
  4. 将Cosmos分配给VNET
    image
  5. 现在,我收到一些消息,指出服务端点不存在,将被创建。 实际发生了什么:
    image
  6. 现在,我创建了一个AppService并向其部署了一个非常简单的asp.net核心应用程序,该应用程序在启动时使用以下代码连接到Cosmos DB。
  7. 我将其连接到VNET,如下所示:
    image
  8. 然后,它向我传达了一条信息,即必须等待几个小时才能进行连接。 (真是这样吗?)
  9. 现在,我访问AppService时显示503:
    image
  10. 如果然后浏览到Kudu并打开D:\home\LogFiles\eventlog.xml我会看到以下消息:
Beginning operations...

Forbidden error occurred: Microsoft.Azure.Cosmos.CosmosException : Response status code does not indicate success: 403 Substatus: 0 Reason: (Microsoft.Azure.Documents.DocumentClientException: Request originated from client IP 52.136.230.110 through public internet. This is blocked by your Cosmos DB account firewall settings.ActivityId: b9bcb4b7-2ad4-4130-b592-fb70b0c18628, Microsoft.Azure.Documents.Common/2.11.0, Windows/10.0.14393 cosmos-netstandard-sdk/3.4.2   at Microsoft.Azure.Cosmos.GatewayStoreClient.ParseResponseAsync(HttpResponseMessage responseMessage, JsonSerializerSettings serializerSettings, DocumentServiceRequest request)   at Microsoft.Azure.Cosmos.GatewayAccountReader.GetDatabaseAccountAsync(Uri serviceEndpoint)   at Microsoft.Azure.Cosmos.Routing.GlobalEndpointManager.GetDatabaseAccountFromAnyLocationsAsync(Uri defaultEndpoint, IList`1 locations, Func`2 getDatabaseAccountFn)   at Microsoft.Azure.Cosmos.GatewayAccountReader.InitializeReaderAsync()   at Microsoft.Azure.Cosmos.CosmosAccountServiceConfiguration.InitializeAsync()   at Microsoft.Azure.Cosmos.DocumentClient.InitializeGatewayConfigurationReaderAsync()   at Microsoft.Azure.Cosmos.DocumentClient.GetInitializationTaskAsync(IStoreClientFactory storeClientFactory)   at Microsoft.Azure.Cosmos.DocumentClient.EnsureValidClientAsync()   at Microsoft.Azure.Cosmos.Handlers.RequestInvokerHandler.EnsureValidClientAsync(RequestMessage request)).
StatusCode = Forbidden;
SubStatusCode = 0;
ActivityId = b9bcb4b7-2ad4-4130-b592-fb70b0c18628;
RequestCharge = 0;
{"Summary":{"StartUtc":"2020-07-23T14:33:28.0440416Z","ElapsedTime":"00:00:00.5533417","UserAgent":"cosmos-netstandard-sdk/3.6.0|3.4.2|43726|X86|Microsoft Windows 10.0.14393|.NET Core 3.1.6|CosmosDBDotnetQuickstart"},"Context":[{"Id":"RequestInvokerHandler","ElapsedTime":"00:00:00.5533417"},{"Id":"PointOperationStatistics","ActivityId":"b9bcb4b7-2ad4-4130-b592-fb70b0c18628","StatusCode":403,"SubStatusCode":0,"RequestCharge":0.0,"RequestUri":"dbs/ToDoList","ErrorMessage":"Microsoft.Azure.Documents.DocumentClientException: Request originated from client IP 52.136.230.110 through public internet. This is blocked by your Cosmos DB account firewall settings.ActivityId: b9bcb4b7-2ad4-4130-b592-fb70b0c18628, Microsoft.Azure.Documents.Common/2.11.0, Windows/10.0.14393 cosmos-netstandard-sdk/3.4.2   at Microsoft.Azure.Cosmos.GatewayStoreClient.ParseResponseAsync(HttpResponseMessage responseMessage, JsonSerializerSettings serializerSettings, DocumentServiceRequest request)   at Microsoft.Azure.Cosmos.GatewayAccountReader.GetDatabaseAccountAsync(Uri serviceEndpoint)   at Microsoft.Azure.Cosmos.Routing.GlobalEndpointManager.GetDatabaseAccountFromAnyLocationsAsync(Uri defaultEndpoint, IList`1 locations, Func`2 getDatabaseAccountFn)   at Microsoft.Azure.Cosmos.GatewayAccountReader.InitializeReaderAsync()   at Microsoft.Azure.Cosmos.CosmosAccountServiceConfiguration.InitializeAsync()   at Microsoft.Azure.Cosmos.DocumentClient.InitializeGatewayConfigurationReaderAsync()   at Microsoft.Azure.Cosmos.DocumentClient.GetInitializationTaskAsync(IStoreClientFactory storeClientFactory)   at Microsoft.Azure.Cosmos.DocumentClient.EnsureValidClientAsync()   at Microsoft.Azure.Cosmos.Handlers.RequestInvokerHandler.EnsureValidClientAsync(RequestMessage request)","RequestSessionToken":null,"ResponseSessionToken":null}]}
   at Microsoft.Azure.Cosmos.ResponseMessage.EnsureSuccessStatusCode()
   at Microsoft.Azure.Cosmos.CosmosResponseFactory.ProcessMessageAsync[T](Task`1 cosmosResponseTask, Func`2 createResponse)
   at Microsoft.Azure.Cosmos.CosmosClient.<>c__DisplayClass41_0.<<CreateDatabaseIfNotExistsAsync>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at CosmosGettingStartedTutorial.Program.CreateDatabaseAsync() in C:\Users\davy\Downloads\DocumentDB-Quickstart-DotNet\CosmosGettingStartedTutorial\Program.cs:line 86
   at CosmosGettingStartedTutorial.Program.GetStartedDemoAsync() in C:\Users\davy\Downloads\DocumentDB-Quickstart-DotNet\CosmosGettingStartedTutorial\Program.cs:line 68
   at CosmosGettingStartedTutorial.Program.Main(String[] args) in C:\Users\davy\Downloads\DocumentDB-Quickstart-DotNet\CosmosGettingStartedTutorial\Program.cs:line 40
End of demo, press any key to exit.
...
...

@hansmbakker和其他人,你看到我错过的任何东西吗?

连接到波斯菊的代码:

    public class Program
    {
        // The Azure Cosmos DB endpoint for running this sample.
        private static readonly string EndpointUri = "https://davycosmos.documents.azure.com:443/";

        // The primary key for the Azure Cosmos account.
        private static readonly string PrimaryKey = "**********";

        // The Cosmos client instance
        private CosmosClient cosmosClient;

        // The database we will create
        private Database database;

        // The container we will create.
        private Container container;

        // The name of the database and container we will create
        private string databaseId = "ToDoList";
        private string containerId = "Items";

        // <Main>
        public static async Task Main(string[] args)
        {
            try
            {
                Console.WriteLine("Beginning operations...\n");
                Program p = new Program();
                await p.GetStartedDemoAsync();

            }
            catch (CosmosException de)
            {
                Exception baseException = de.GetBaseException();
                Console.WriteLine("{0} error occurred: {1}", de.StatusCode, de);
            }
            catch (Exception e)
            {
                Console.WriteLine("Error: {0}", e);
            }
            finally
            {
                Console.WriteLine("End of demo, press any key to exit.");
                Console.ReadKey();
            }
        }
        // </Main>

        // <GetStartedDemoAsync>
        /// <summary>
        /// Entry point to call methods that operate on Azure Cosmos DB resources in this sample
        /// </summary>
        public async Task GetStartedDemoAsync()
        {
            // Create a new instance of the Cosmos Client
            this.cosmosClient = new CosmosClient(EndpointUri, PrimaryKey, new CosmosClientOptions() { ApplicationName = "CosmosDBDotnetQuickstart" });
            await this.CreateDatabaseAsync();
            await this.CreateContainerAsync();
            await this.ScaleContainerAsync();
            await this.AddItemsToContainerAsync();
            await this.QueryItemsAsync();
            await this.ReplaceFamilyItemAsync();
            await this.DeleteFamilyItemAsync();
            await this.DeleteDatabaseAndCleanupAsync();
        }
        // </GetStartedDemoAsync>

        // <CreateDatabaseAsync>
        /// <summary>
        /// Create the database if it does not exist
        /// </summary>
        private async Task CreateDatabaseAsync()
        {
            // Create a new database
            this.database = await this.cosmosClient.CreateDatabaseIfNotExistsAsync(databaseId);
            Console.WriteLine("Created Database: {0}\n", this.database.Id);
        }
    }

@devedse感谢您提供特定于您的部署的详细信息。 我看不到与您创建的VNET相关的专用链接。 专用端点建立由VNET配置定义的专用地址空间。 您所没有的是为该VNET中设置的Cosmos DB for SQL API _service_发布的专用IP地址。 请参阅以下内容完成配置:为Azure Cosmos帐户配置Azure专用链接
如果实际上确实配置了Cosmos DB Privatelink,则由于未启用Accept connections from within public Azure datacenters ,因此需要将App Service NSG添加到Cosmos DB VNET中以允许流量通过。 您将需要明确允许该服务(NSG)连接。 FAQ页面没有捕获所有必需的步骤。 如果您还有其他问题,请告诉我。 问候,迈克。

注意:通过使用NSG(而不是静态IP和端口值),当IP地址发生更改时,NSG将自动更新。 在每次进行Azure维护更新时,在NSG外部实施的任何手动配置都将需要干预以更新正确的值。

嗨@ Mike-Ubezzi-MSFT,我一直在尝试按照您的步骤进行操作,但仍然遇到一些新问题:

  1. 我尝试设置专用端点,但出现此错误:
    image
  2. 然后,我想删除委托,但是失败了,因为仍然连接了应用程序服务:
    image
  3. 然后,我从appservice中删除了VNET
    image
  4. 然后我尝试再次删除代表,现在可以了
    image
  5. 然后,我尝试再次添加专用端点,该端点现在可以正常工作(请确保您对设置有很好的了解,因为出于某些原因它会不断使用来自不同资源组的子网来预填充它们):
    image
  6. 现在,当我尝试将AppService重新添加到子网中时,我被禁止:
    image

  7. 然后,如您所述,我创建了一个NSG并将其与VNET关联:
    image

但是,我现在对下一步的工作感到很困惑。 您提到App Service应该已经有NSG吗? 所以我不应该创建它吗? 我不确定下一步该怎么做。

@ Mike-Ubezzi-MSFT,已经有一段时间了,因为有人对此主题做出了反应。 您知道我缺少哪些步骤吗?

好的,我终于设法使其工作了,我做了以下工作:

  1. 我尝试删除NSG,因为我认为我们不需要它,但是要删除此NSG,我首先想取消子网的关联。 这给了我以下错误:
    image
  2. 忽略此错误并继续; 我添加了一个新的子网:
    image
  3. 我将AppService连接到此新子网:
    image
  4. 我通过设置以下应用程序设置来配置DNS:
    image
    https://docs.microsoft.com/zh-cn/azure/app-service/web-sites-integrate-with-vnet#azure -dns-private-zones
  5. 当我现在打开KUDU并执行NSLOOKUP时,最终得到了正确的IP地址:
    image
  6. 然后,我重新运行我的代码,然后突然开始在cosmos db中弹出项目:)

您提到的@devedse在最近的更新中最终创建了另一个新的子集,请您说明一下cosmos DB私有终结点和Web应用程序服务是否以相同的子集结尾?

我讨论了CosmosDB的问题,即需要一个子集而不需要任何奉献,但是Web应用程序服务需要一个子集来专门奉献servicefarm,这意味着这两个需求相互冲突。 @ Mike-Ubezzi-MSFT

@dawwa ,它们现在都位于单独的子网中。

@devedse ,感谢您的澄清,以下部分提到了WEBSITE_VNET_ROUTE_ALL is currently not supported in Windows containers. ,但是看起来您是在Windows容器上吗?
https://docs.microsoft.com/zh-cn/azure/app-service/web-sites-integrate-with-vnet#how -regional-vnet-integration-works

@dawwa ,我正在使用Linux容器。 (我真的建议您使用Linux容器,除非您确实有仅在Windows上运行的应用程序)。

这个问题需要得到更深入的研究的支持,因为删除和添加NSG似乎有些复杂,等等。请确保此步骤已完成(如果适用)。

在子网上启用Azure Cosmos DB的服务终结点后,到达帐户的流量来源将从公共IP切换到虚拟网络和子网。 如果您的Azure Cosmos帐户仅具有基于IP的防火墙,则来自已启用服务的子网的流量将不再与IP防火墙规则匹配,因此将被拒绝。 仔细查看步骤,以从基于IP的防火墙无缝迁移到基于虚拟网络的访问控制。

另外,这一点:对等虚拟网络是否也可以访问Azure Cosmos帐户?

只有虚拟网络及其添加到Azure Cosmos帐户的子网可以访问。 在对等虚拟网络中的子网添加到该帐户之前,其对等VNet无法访问该帐户。

@ Mike-Ubezzi-MSFT,您能否将我与某些Microsoft人员联系起来。 我基本上是想通过Terraform部署整个解决方案,但是我遇到了很多问题,例如:

  1. 由于503错误而无法部署Azure Functions
  2. Azure Function部署需要60分钟以上的时间,然后运行超时
  3. Azure Function运行时在Azure门户上不起作用。 (当我打开Azure函数时,它根本不会加载网页并在门户中显示错误)

所有这些似乎都与VNET中的某些功能有关,但我不知道该如何整合。

主要是因为有时第一个部署确实可以工作,所以看来我的代码是正确的(有时却不正确)。 但是,当您进行后续部署时,一切都会崩溃。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

bityob picture bityob  ·  3评论

paulmarshall picture paulmarshall  ·  3评论

spottedmahn picture spottedmahn  ·  3评论

jamesgallagher-ie picture jamesgallagher-ie  ·  3评论

Ponant picture Ponant  ·  3评论