Azure APIM与Function Apps配置问题:仅允许通过APIM访问函数应用
解决Azure Function Apps仅允许APIM访问的问题
我先帮你理清楚问题根源:你把Function的IP限制设成只允许VNet内的流量,但External模式的APIM默认是用公网IP向Function发起请求的,这个公网IP不在你的VNet地址范围里,所以Function直接拒绝并返回403。而当你把自己的IP加入允许列表时,Function可能会读取请求里的X-Forwarded-For头(如果无意中开启了信任代理),把你的客户端IP当成源IP,结果既允许了APIM的转发请求,也让你能直接访问Function了。
下面给你两个靠谱的解决方案,按需选择:
方案一:用VNet集成让APIM和Function在同一网络内访问(更安全)
这个方案能让APIM从VNet内部访问Function,彻底隔绝公网直接访问的可能:
1. 给Consumption计划的Function配置Regional VNet集成
Consumption计划现在已经支持Regional VNet集成了,操作步骤:
- 打开你的Function App,进入网络 -> VNet集成页面
- 点击添加VNet,选择你之前创建的VNet,建议专门给Function分配一个子网(比如
192.168.0.32/27,别和APIM用的子网冲突) - 完成配置后,Function就会加入到你的VNet中,只有VNet内的流量才能访问它
2. 配置APIM通过VNet访问Function
- 进入APIM的后端页面,找到你导入的Function后端
- 把后端URL改成Function的VNet内部访问地址(或者直接用Function的私有端点地址,如果你创建了私有端点的话)
- 确保APIM的VNet连接有权限访问Function所在的子网,这样APIM发起的请求源IP就是VNet内的地址,符合Function的IP限制规则
3. 锁定Function的IP限制
保持你之前的规则:允许192.168.0.0/24,默认拒绝所有其他流量。这样公网直接访问Function会被403拦截,只有APIM的VNet内请求能通过。
方案二:允许APIM的出站IP,再加额外验证(更简单)
如果不想折腾VNet集成,可以用这个方法,重点是让Function只接受APIM的请求:
1. 获取APIM的出站IP地址
打开APIM实例的概述页面,找到出站IP地址列表(一般是多个IP,全部记下来)
2. 更新Function的IP限制规则
- 进入Function App的网络 -> 访问限制页面
- 删除之前的VNet地址允许规则,添加新规则:允许APIM的所有出站IP地址
- 把默认规则设为拒绝所有其他流量
3. 加一层额外验证(推荐)
为了防止有人伪造APIM的IP访问Function,建议加个额外验证:
- 在APIM的API策略里,添加一个自定义请求头,比如
X-APIM-Secret,值设为一个只有你知道的密钥 - 在Function的代码入口(比如用Middleware或者函数开头的逻辑),检查请求里是否包含这个头,并且值正确,否则返回403
- 或者用AAD身份验证:让APIM用专属的服务主体访问Function,同时在Function里设置AAD身份验证,只允许这个服务主体的请求通过
内容的提问来源于stack exchange,提问作者bbz
相关产品推荐
相关产品推荐

