配置策略阻止创建带公网IP的VM时遇字段不接受错误
解决Azure策略阻止VM创建公网IP时的字段错误问题
错误原因
你使用的Microsoft.Network/publicIPAddresses.ipConfiguration.id是只读字段,在创建公网IP资源的阶段,该字段尚未被填充(公网IP需先创建完成,再关联到VM的网卡,或在创建网卡时关联),因此Azure策略引擎无法在创建公网IP时识别这个字段,导致"字段不被接受"的错误。
正确策略方案
方案1:阻止VM网卡关联公网IP(推荐)
该策略直接针对网络接口(Network Interface),拒绝任何关联了公网IP的网卡创建,从根源上阻止VM获得公网IP:
{ "mode": "Indexed", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Network/networkInterfaces" }, { "count": { "field": "Microsoft.Network/networkInterfaces/ipConfigurations[*].publicIPAddress.id" }, "greaterOrEquals": 1 } ] }, "then": { "effect": "deny" } }, "parameters": {} }
方案2:直接阻止创建带公网IP的VM
该策略针对VM资源本身,检查其关联的网卡是否带有公网IP,若有则拒绝VM创建:
{ "mode": "Indexed", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Compute/virtualMachines" }, { "exists": { "field": "Microsoft.Compute/virtualMachines/networkProfile.networkInterfaces[*].properties.ipConfigurations[*].publicIPAddress.id" } } ] }, "then": { "effect": "deny" } }, "parameters": {} }
方案3:完全禁止创建公网IP(可选)
如果需要彻底禁止所有公网IP资源的创建,可使用以下策略:
{ "mode": "Indexed", "policyRule": { "if": { "field": "type", "equals": "Microsoft.Network/publicIPAddresses" }, "then": { "effect": "deny" } }, "parameters": {} }
注意事项
- 方案1和方案2允许公网IP用于其他资源(如负载均衡器),仅限制VM使用,更灵活;
- 方案3会禁止所有公网IP的创建,适合完全封闭的环境;
- 策略的
mode设置为Indexed即可,无需使用All,因为仅需针对可索引的资源类型生效。
内容的提问来源于stack exchange,提问作者Mahad
相关产品推荐
相关产品推荐

