You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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公网访问:

  1. 配置缩放控制器专用访问
    进入函数App的网络配置页,在「Runtime scale monitoring」配置项下,为缩放控制器绑定与函数同VNet的专用端点,确保缩放控制器的所有监控流量走VNet内部链路,不再绕公网。注意:仅开启Runtime Scale Monitoring开关不配置专用端点,不会改变缩放控制器的公网访问行为,这也是之前操作无效的原因。
  2. 修正Service Bus网络配置
    • 将Service Bus的Public access选项直接设置为Disabled,完全禁用公网访问,避免公网白名单、专用端点规则同时存在产生配置冲突
    • 检查Service Bus专用端点所在子网的配置,确认已禁用「专用终结点网络策略」,否则子网关联的NSG、UDR会拦截跨子网的专用端点流量
    • 检查函数子网、Service Bus专用端子网关联的NSG规则,放通两个子网之间443、5671、5672端口(AMQP协议端口)的双向流量,不要做端口拦截。
  3. 校验连接字符串配置
    • 检查ServiceBusConnectionString配置项,不要追加;TransportType=AmqpWebSockets这类强制走公网WebSocket隧道的参数,保持默认AMQP传输模式即可
    • 不要在连接字符串中硬编码Service Bus的公网IP,使用默认的Service Bus命名空间域名即可,依托VNet内的私有DNS解析到专用端点私有IP。
  4. 连通性验证
    配置完成后重启函数App,进入函数的「诊断并解决问题」面板,找到「Service Bus触发器连通性检查」内置工具运行自动检测,工具会分别校验缩放控制器、函数实例到Service Bus的网络连通性、权限配置,所有检测项通过后,发送测试消息即可验证消费链路正常。

注:之前尝试的VNet白名单、函数子网IP加白操作无效,是因为缩放控制器的公网IP属于Azure公共IP池的动态地址段,不属于VNet内的IP范围,无法通过静态加白的方式覆盖,只有配置专用端点走内部链路才符合零公网暴露的合规要求。

内容的提问来源于stack exchange,提问作者Stephen Parker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:12:13