【问题标题】:How to access on-premises webservice from within an azure function如何从 azure 函数中访问本地 Web 服务
【发布时间】:2020-12-14 00:40:04
【问题描述】:

我们有一个连接到本地 Web 服务的服务结构解决方案。调用 Web 服务对于 Service Fabric 解决方案来说不是问题。一切正常。

我们必须从 SF 解决方案中提取功能并将其转换为 Azure Function。

问题是 Azure Function 无法连接到本地 Web 服务。这是我们收到的错误:

“调用时出错.... api:连接尝试失败,因为 关联方在一段时间后没有正确响应,或 建立连接失败,因为连接的主机未能 回应。”

当前设置:

  • 一个包含以下子网的天蓝色 VNET“vnetA”:

    • subA 10.0.1.128/25,它是具有站点到站点 (IPsec) 连接的虚拟网络网关。我认为是本地网络服务。
    • subB 10.0.1.0/25,它是 Service Fabric 解决方案使用的子网。
    • subC 10.0.2.0/25,这是包含 Azure 函数的 Function App 使用的子网。
  • Function App/Azure Function 连接到 vnetA 和子网 subC (10.0.2.0/25) 计划类型:应用服务计划 - 标准 S1,它没有定义代理。

  • 连接到 SF 解决方案和 Azure Function 的 Api 管理服务。 (如果我们绕过这个并使用函数 url 错误是一样的。)

  • 子网 subA 有以下设置:

    • NAT 网关:无
    • 路由表:无
    • 服务:未选择
    • 将子网委托给服务:无
    • 网络安全组:无
  • 子网 subC 有以下设置:

    • NAT 网关:无
    • 路由表:无
    • 服务:未选择
    • 将子网委托给服务:Microsoft.Web/ServerFarms
    • 网络安全组:nsgA

网络安全组设置:

设置 azure 网络的人不再为我们工作。我需要做什么才能使其正常工作?我是一名开发人员,以前从未在 (Azure) 网络上工作过,所以这超出了我的舒适区,我似乎无法在 Internet 上找到/理解任何内容。

更新: 如果不使用基本价格为每月 1000 美元以上的 ASE(Azure 应用服务环境),Azure 功能似乎无法访问本地资源。所以我将不得不寻找某种解决方法。

【问题讨论】:

  • 你能检查 sub A 和 C 之间的网络规则,看看是否允许流量?您是否正确地在函数中进行了 vnet 集成和代理设置?
  • @Aravind 我用您要求的信息更新了我的问题。没有为 azure 函数定义代理。
  • ok 代理不是强制性的,但它用于需要将请求转发到 vnet 内的资源的情况。

标签: azure azure-functions azure-virtual-network azure-function-app


【解决方案1】:

我关心的一件事是“计划类型:标准”。你的意思是这个“消费(无服务器)”吗?如果是,这可能是个问题 - 区域 VNET 集成仅适用于“高级”(消费)计划。

或者您是否拥有常规“标准”应用服务计划?在这种情况下,我会问(考虑到首先部署它的人不再在您的组织中),该功能有多旧。关注官方文档 (https://docs.microsoft.com/en-us/azure/app-service/web-sites-integrate-with-vnet#regional-vnet-integration):

该功能仅适用于较新的 Azure 应用服务规模 支持 PremiumV2 应用服务计划的单元。请注意,这确实 并不意味着您的应用程序必须在 PremiumV2 定价层上运行,只是它 必须在 PremiumV2 选项所在的应用服务计划上运行 可用(这意味着它是一个较新的缩放单位,此 VNet 然后也可以使用集成功能)。

如果以上都可以,我还会考虑 DNS - 你如何调用本地 Web 服务?您使用的是 FQDN 吗?如果是,Function App 可以解析名称吗?

我建议您使用应用服务控制台检查连接。请注意,对于沙盒限制,您不能使用 nslookup 和 ping 命令行工具。相反,MSFT 为您提供 nameresolver 和 tcpping。参考见this图片。

【讨论】:

  • 套餐类型为:App Service Plan - Standard S1
  • 使用 IP 地址调用本地服务,因此解决问题不是问题。使用控制台检查连接会返回连接超时。
  • 在本地部署防火墙,也许?另外,您的子网 C 是新子网吗?如果在配置 VPN 隧道时它不存在,则可能是您缺少本地路由。在这种情况下,终止隧道的设备根本不知道 10.0.2.0/25 的下一跳在隧道的另一端。来自 Function 的请求到达 Web 服务,但响应未正确路由。如果您启用了 BGP,那将不是问题,但它是 Azure 中 VPN 的一个相对较新的功能,所以我希望静态路由
  • 子网 C 确实是一个新子网。超时发生在 21 秒后,并且在您链接到它的文档中说这可能是由防火墙引起的,所以您可能是对的。明天我会联系服务负责人。
【解决方案2】:

显然,如果不使用 ASE(Azure 应用服务环境),就不可能从 Azure 函数中访问本地资源。问题是这将使您每月损失大约 1000 美元。

为了解决这个问题,我们选择在容器内运行 azure 函数,在 kubernetes 集群内。很多开销,但没有那么贵...

【讨论】:

  • 你有官方文档的链接来说明这一点吗?
  • docs.microsoft.com/en-us/azure/app-service/environment/…。在“虚拟网络支持”标题下
  • 谢谢你,虽然这个文档没有像你所说的那样断言"...it is impossible to access on-prem resources from within an Azure function without using an ASE..."。我正在寻找这样说的东西。否则,我仍在研究如何在没有 ASE 的情况下做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 2011-05-23
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
相关资源
最近更新 更多