Azure专用端点下Service Bus与函数接收器报IP连接被阻止错误
问题描述
部署架构
- 部署1个包含2个子网的Azure虚拟网络(VNet)
- Azure Service Bus命名空间通过专用端点(Private Endpoint)接入其中1个子网,实例已配置供Azure函数使用的主题(Topic)与订阅(Subscription)
- 搭载Service Bus触发器的Azure函数通过专用端点接入另1个子网,使用RootSharedAccessKey连接Service Bus,拉取订阅消息
故障现象
该配置下函数无法正常拉取订阅消息,Azure Monitor中重复抛出异常:
Ip has been prevented to connect to the endpoint
已完成排查验证
- 第三个子网通过VNet集成部署的HTTP触发型函数,可正常向Service Bus推送消息,链路无异常
- 将Service Bus网络设置修改为允许「All networks」访问后,函数可成功处理消息,可排除Shared Access Key配置错误问题,但该配置将Service Bus暴露于公网,不符合安全合规要求
- 已在Function runtime settings中开启Runtime Scale Monitoring功能,问题未解决
- 已尝试配置Service Bus网络白名单:将Public access设置为Selected networks,把函数所在VNet、子网加入Virtual networks允许列表,同时在Firewall允许列表添加函数子网私有IP段,问题未解决
- VNet内部署虚拟机连通性测试确认:VNet默认私有DNS运行正常,所有域名(含
.privatelink.后缀域名)均可解析到正确私有IP - 所有相关服务均部署在同一Azure数据中心
触发函数代码
public class ConsumerFunction { [FunctionName("ConsumerFunction")] public void Run([ServiceBusTrigger("sometopic", "somesubscription", Connection = "ServiceBusConnectionString")]string contentString, ILogger log) { log.LogInformation("ConsumerFunction: started with content {content}", contentString); } }
排查思路与解决方案
该故障的核心根因是Service Bus触发器的平台侧缩放控制器流量未走专用链路,之前的所有配置仅覆盖了函数实例本身的出站流量,遗漏了平台托管组件的访问逻辑:
- HTTP触发函数的所有逻辑都运行在配置了VNet集成的函数实例上,因此推送消息的流量正常走VNet链路,无访问问题
- Service Bus触发器的访问分为两部分:一是函数实例运行时拉取消息的流量,二是Azure平台托管的缩放控制器流量——后者负责实时监控Service Bus订阅的消息堆积长度,动态决定函数实例扩缩容数量,默认走公网访问Service Bus,完全不受配置的VNet集成、专用端点规则约束。这部分公网流量被Service Bus的公网访问拦截策略阻断,就会抛出
Ip has been prevented to connect to the endpoint错误,直接导致整个触发器链路无法启动。
按以下步骤修复即可,全程不需要开放Service Bus公网访问:
- 配置缩放控制器专用访问
进入函数App的网络配置页,在「Runtime scale monitoring」配置项下,为缩放控制器绑定与函数同VNet的专用端点,确保缩放控制器的所有监控流量走VNet内部链路,不再绕公网。注意:仅开启Runtime Scale Monitoring开关不配置专用端点,不会改变缩放控制器的公网访问行为,这也是之前操作无效的原因。 - 修正Service Bus网络配置
- 将Service Bus的Public access选项直接设置为
Disabled,完全禁用公网访问,避免公网白名单、专用端点规则同时存在产生配置冲突 - 检查Service Bus专用端点所在子网的配置,确认已禁用「专用终结点网络策略」,否则子网关联的NSG、UDR会拦截跨子网的专用端点流量
- 检查函数子网、Service Bus专用端子网关联的NSG规则,放通两个子网之间443、5671、5672端口(AMQP协议端口)的双向流量,不要做端口拦截。
- 将Service Bus的Public access选项直接设置为
- 校验连接字符串配置
- 检查
ServiceBusConnectionString配置项,不要追加;TransportType=AmqpWebSockets这类强制走公网WebSocket隧道的参数,保持默认AMQP传输模式即可 - 不要在连接字符串中硬编码Service Bus的公网IP,使用默认的Service Bus命名空间域名即可,依托VNet内的私有DNS解析到专用端点私有IP。
- 检查
- 连通性验证
配置完成后重启函数App,进入函数的「诊断并解决问题」面板,找到「Service Bus触发器连通性检查」内置工具运行自动检测,工具会分别校验缩放控制器、函数实例到Service Bus的网络连通性、权限配置,所有检测项通过后,发送测试消息即可验证消费链路正常。
注:之前尝试的VNet白名单、函数子网IP加白操作无效,是因为缩放控制器的公网IP属于Azure公共IP池的动态地址段,不属于VNet内的IP范围,无法通过静态加白的方式覆盖,只有配置专用端点走内部链路才符合零公网暴露的合规要求。
内容的提问来源于stack exchange,提问作者Stephen Parker
相关产品推荐
相关产品推荐

