我已经部署了一个在消费定价计划上运行的 .NET Core Azure Function App,它通过 EF Core 连接到我的网站提供商托管的 MS SQL 数据库。
尝试数据库连接时,我看到 App Insights 报告以下错误:
Microsoft.Data.SqlClient.SqlException (0x80131904):建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:TCP Provider,错误:0 - 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应。) System.ComponentModel.Win32Exception(10060):连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应。...错误号:10060,状态:0,类:20
我按照此处的说明获取函数应用程序outboundIpAddresses
(使用Azure 资源资源管理器,我还使用 Azure CLI 进行了双重检查)。
我将 IP 列表传递给了我的托管服务提供商的支持团队,但仍然收到相同的错误。
我知道这与代码无关,因为当我在本地运行我的函数应用程序时,我可以正常连接(我的本地 IP 在 SQL Server 允许列表中)。
为什么 Azure 函数连接不上数据库?
这是一个小型家庭项目,所以我买不起虚拟网络 NAT 网关路由。
在消费定价计划上运行
在消费计划上运行的函数报告的出站 IP 地址不可靠。
根据Azure 文档:
缩放在消费计划或高级计划上运行的函数应用时,可能会分配新的出站 IP 地址范围。在使用这些计划中的任何一个时,您都不能依赖报告的出站 IP 地址来创建明确的允许名单。为了能够包含在动态扩展期间使用的所有潜在出站地址,您需要将整个数据中心添加到您的许可名单中。
相反,请为您的托管服务提供商提供托管您的 Azure 函数的 Azure 区域(/数据中心)的出站 IP 地址,以涵盖您的 Azure 函数可能分配的所有可能 IP。
所有区域的官方 Azure IP 范围都在一个 JSON 文件中,可在此处下载。
首先,下载这个文件。
其次,搜索AzureCloud.[region name]
例如AzureCloud.uknorth
或AzureCloud.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 的免费套餐包括每月 100 万次免费请求(如 Azure)和每月 400,000 GB 秒的计算时间,这应该足够了。
对于连接,您需要一个 VPC(免费)、一个 Internet 网关(免费 + 可忽略的数据传输成本)、一个弹性 IP 地址(免费)和一个托管 NAT 网关(大约每天 1 美元,具体取决于地区)。
哦 - 而且您将获得额外的好处,即只需向您的托管服务提供商提供 1 个弹性 IP 地址,无论您采用何种“定价计划”,该地址都将始终保持不变。
如果有的话,如果超出范围,我也会将 AWS 作为未来项目的潜在选择:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句