问题描述
在Azure App Service中部署的应用,需要连接到Redis中,目标Redis已经集成了虚拟网络(VNET)并且在Redis的网络防火墙中已经添加App Service的出站IP地址到白名单中。但是检查应用日志发现Redis一直无法连接,错误消息为:
No connection is active/available to service this operation: DEL Key1; It was not possible to connect to the redis server(s). Error connecting right now. To allow this multiplexer to continue retrying until it‘s able to connect, use abortConnect=false in your connection string or AbortOnConnectFail=false; in your code. ConnectTimeout, mc: 1/1/0, mgr: 10 of 10 available, clientName: DTOP-AM, IOCP: (Busy=0,Free=100,Min=100,Max=100), WORKER: (Busy=1,Free=99,Min=100,Max=100), v: 2.1.30.38891 |
解决问题
当Redis配置了虚拟网络后,只能在该虚拟网络(VNET)之内访问Redis服务,所以配置Reids的防火墙白名单是无效的。需要把当前的App Service也集成在同一个虚拟网络(VNET)中,让App Service通过内网方式访问Redis服务。
参考资料
Azure Cache for Redis 虚拟网络常见问题解答:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-how-to-premium-vnet#azure-cache-for-redis-virtual-network-faq
将应用与 Azure 虚拟网络集成:https://docs.azure.cn/zh-cn/app-service/web-sites-integrate-with-vnet
在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
3) Redis的防火墙的白名单起什么作用呢?是否可以设置允许外网的IP地址进行访问呢?
当集成在内部虚拟网络之后,外部公网是不可以继续访问的[VNet 是云中的专用网络。 为 Azure Redis 缓存实例配置了 VNet 后,该实例不可公开寻址,而只能从 VNet 中的虚拟机和应用程序进行访问]。而此时,防火强的白名单的作用对象也变成了内网中的IP地址,即:可以通过设置防火墙白名单,只允许内网中的部分资源访问Redis。