我们在门户上部署了时间触发的Azure功能,以便在特定时间执行某些迭代任务。我们的azure函数使用通过AppSettings提供的连接字符串在Azure VM上部署的数据库。该函数在运行时抛出以下错误:
MySql.Data:使用方法'mysql_native_password'对用户'xxx'的主机'xxx'进行身份验证失败,并显示以下消息: IP地址为“x.x.x.x”的客户端不允许连接到此MySQL服务器。 MySql.Data:IP地址为'x.x.x.x'的客户端不允许连接到此MySQL服务器*
当我们列出错误消息中提到的IP时,该函数成功运行。但由于azure函数没有确定的工作站或处理执行的相同IP的PC,因此每当函数从新IP运行时,它都会抛出错误。因此,我们需要一种机制,通过该机制,我们可以列出将运行我们的功能应用程序的所有PC的IP,或者一些更好的机制来验证并允许azure功能访问Azure VM上托管的数据库。
我们尝试了什么?
我们尝试将从我们的功能应用程序部署区域的Microsoft Datacenter获取的IP范围列入白名单。但这种方法也行不通。
因此,有没有办法让azure函数可以安全地访问部署在虚拟机上的数据库?
我已经在github上打开了issue但是还没有回复。
答案 0 :(得分:2)
最后,经过深入研究,找到了解决方案。
需要在部署了数据库的虚拟机中将所有功能应用程序的出站IP列入白名单。出站IP地址可以从resources.azure.com找到。在搜索资源时(在我的案例中,功能应用程序的名称),将有一个长json输出,您必须从中选择possibleOutboundIpAddresses
参数,如图所示。将所有Ips列入白名单,然后您的azure功能应用程序可以访问部署在虚拟机上的数据库。
此外,我搜索了这些IP是否会定期更改。虽然我没有从中找到任何官方消息,但是从各种互联网来源我开始知道,即使IP计划永远改变,每个人都会在此之前获得足够的通知以防止出现任何问题。
答案 1 :(得分:1)
您需要设置一个虚拟网络(VNet),托管Azure功能的应用程序服务计划和VM都将参与其中。
然后从Azure Functions中,查看“所有属性”>“网络”,您应该看到要连接的虚拟网络。
此方法不需要您将VM的IP地址列入白名单,并仅允许内部网络流量来保护VM。
请注意,必须在App Service计划而非消费计划上设置Azure功能。