【问题标题】:SqlException server not found error when connecting to an SQL DB from an Azure Function App从 Azure 函数应用程序连接到 SQL DB 时找不到 SqlException 服务器错误
【发布时间】:2022-07-30 03:29:27
【问题描述】:

我已经部署了一个在消费定价计划上运行的 .NET Core Azure Function App,它通过 EF Core 连接到我的网站提供商托管的 MS SQL 数据库。

尝试数据库连接时,我看到 App Insights 报告以下错误:

Microsoft.Data.SqlClient.SqlException (0x80131904):网络相关 或在建立连接时发生特定于实例的错误 SQL 服务器。服务器未找到或无法访问。核实 实例名称正确且 SQL Server 配置为 允许远程连接。 (提供者:TCP 提供者,错误:0 - A 连接尝试失败,因为连接方没有正确 一段时间后响应,或建立连接失败 因为连接的主机没有响应。) System.ComponentModel.Win32Exception (10060):连接尝试 失败,因为连接方没有正确响应后 一段时间,或建立连接失败,因为已连接 主机未能响应。 ... 错误号:10060,状态:0,类:20

我按照here 的说明获取了函数应用的outboundIpAddresses(使用Azure Resource Explorer,我还用Azure CLI 仔细检查了它)。

我将 IP 列表传递给了托管服务提供商的支持团队,但仍然收到相同的错误。

我知道这与代码无关,因为当我在本地运行我的函数应用时,我可以正常连接(我的本地 IP 在 SQL Server 允许列表中)。

为什么Azure函数连接不上数据库?

这是一个小型的家庭项目,所以我负担不起虚拟网络NAT网关路由。

【问题讨论】:

  • 对于其他上下文,我重新部署到第二个区域,以检查托管公司是否通过给他们新的集合来检查是否在任何地方输入了错误的 IP。仍然是同样的问题(所以它看起来不像是人为错误 - 就像这个问题 stackoverflow.com/questions/69820683/… 的情况一样)而且我似乎遇到了与这个相关问题 stackoverflow.com/questions/68568953/… 相同的问题

标签: sql-server azure .net-core azure-functions whitelist


【解决方案1】:

按照消费定价计划运行

Consumption 计划上运行的函数报告的出站 IP 地址不可靠。

根据Azure documentation

当在 Consumption 计划或 Premium 计划上运行的函数应用进行缩放时,可能会分配新的出站 IP 地址范围。在使用这些计划中的任何一个时,您都不能依赖报告的出站 IP 地址来创建明确的允许名单。 为了能够包含在动态扩展期间使用的所有潜在出站地址,您需要将整个数据中心添加到您的许可名单中。

相反,请向您的托管服务提供商提供托管您的 Azure 函数的 Azure 区域(/数据中心)的出站 IP 地址,以涵盖您的 Azure 函数可能分配的所有可能 IP。

所有区域的官方 Azure IP 范围都在一个 JSON 文件中,可供下载 here

首先,下载这个文件。

其次,搜索AzureCloud.[region name],例如AzureCloud.uknorthAzureCloud.centralfrance 将显示您特定区域中 Azure 云的 IP 地址。

{
  "name": "AzureCloud.uknorth",
  "id": "AzureCloud.uknorth",
  "properties": {
    "changeNumber": 11,
    "region": "uknorth",
    "regionId": 29,
    "platform": "Azure",
    "systemService": "",
    "addressPrefixes": [
      "13.87.120.0/22",
      ...
      "2603:1027:1:1c0::/59"
    ],
    "networkFeatures": []
  }
}

最后,向您的托管服务提供商提供片段中列出的所有 IP 地址。

然后您的 Azure 函数应该能够始终连接到您的数据库。


注意该列表会随着时间的推移而更新,尽管添加的内容多于更改的内容 - 目前,最后修改日期为 2022 年 4 月 26 日,如下载页面上的详细信息部分所述。

如果出现任何问题,请确保检查页面是否有更新或保证不会出现中断,请升级您的定价计划。


额外的想法...

正如您提到的,这是一个小型项目,我不确定 Azure 的定价如何,但我会在 AWS 上托管相同的项目。

对于函数本身,AWS Lambda 的 free tier 包括每月 100 万次免费请求(如 Azure)和每月 400,000 GB-秒的计算时间,这应该足够了。

对于连接,您需要一个 VPC(免费)、一个 Internet 网关(免费 + 可忽略的数据传输成本)、一个弹性 IP 地址(免费)和一个托管 NAT 网关(每天大约 1 美元,具体取决于地区) .

哦 - 而且您将获得额外的好处,即只需向您的托管服务提供商提供 1 个弹性 IP 地址,无论您采用何种“定价计划”,它都将始终保持不变。

如果有的话,如果超出范围,我也会将 AWS 作为未来项目的潜在选择 :)

【讨论】:

  • 谢谢你——不知怎的,我的眼睛已经越过了你引用的粉红色/紫色部分。我实际上已经下载了该 JSON 文件,但不确定为什么在提供 outboundIpAddresses 时需要它(并且也不太确定我的主机提供商是否会热衷于添加 100 多个 IP - 我想我可能会找出来!)。让我想知道为什么outboundIpAddresses 如果它不是可靠的头脑,为什么会提供给消费计划。它提到了与扩展思想相关的出站 IP 的变化——我没想到我的有(相当基本的计时器触发器)
  • @d219 不客气 - 是的,有 100 多个 IP,因此我建议 AWS 也是一种可能的途径。我认为通过扩展它也意味着每次函数停止和启动时 - 不完全确定 Azure 在初始调用后保持它们运行多长时间(我是 AWS 人)但它很可能会在每次函数扩展时发生变化当你发送请求时.提供它是因为为什么不呢!
  • 越来越像 AWS 路线可能是最好的选择(我的妻子会很高兴,因为她是 AWS 的拥护者!)。我进一步查看了 JSON 下载文件信息,这个文本(来自 microsoft.com/en-us/download/confirmation.aspx?id=56519 的安装说明)听起来很讨厌“这个文件每周更新一次。文件中出现的新范围将不会在 Azure 中使用至少一个周。请每周下载新的 json 文件,并在您的站点执行必要的更改,以正确识别 Azure 中运行的服务。”
  • @d219 是为了让你升级你的定价方案——听老婆的! AWS 上的 .NET 非常棒。如果您在快速设置方面需要任何帮助,请在 LinkedIn 上给我留言,如果遇到障碍,请随时提出任何新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多