Pulumi部署Azure SQL Managed Instance因网络意图策略错误失败
问题根因梳理
- 第一阶段
Network security group is required报错:你所使用的Azure区域/订阅尚未全量开放SQL MI服务辅助子网自动配置功能,该能力仍处于灰度阶段,多数场景下仍需要手动预配置符合要求的NSG和路由表,仅配置子网委托无法完成部署。 - 第二阶段
Step 3/3 SQL Instance Cleanup报错:主要有两个常见原因,一是你手动绑定的NSG、路由表规则不符合SQL MI的强制准入要求,二是子网CIDR范围不符合最小规格要求,或前次失败部署残留的虚拟集群资源未清理。
具体修复步骤
- 子网基础配置校验
- 确认子网CIDR最小长度:常规用途层实例要求子网掩码不大于/27(至少32个可用地址),业务关键层实例要求子网掩码不大于/27,如需后续扩容实例建议预留/24及以上的地址段
- 确认子网内未部署任何非SQL MI相关资源,包括VM、网卡、负载均衡、其他服务的委托配置等
- 配置符合要求的NSG
必须在NSG中添加以下规则,且优先级高于所有自定义拒绝规则:- 入站规则:放开端口1433、1434、1452、3000039999、4000049999,来源为
VirtualNetwork,动作为允许 - 出站规则:放开端口443、9000、1438、1440、1452、3000039999、4000049999,目标为
VirtualNetwork,动作为允许
- 入站规则:放开端口1433、1434、1452、3000039999、4000049999,来源为
- 配置符合要求的路由表
- 路由表必须开启
传播网关路由选项,不需要手动添加自定义路由,Azure会自动注入SQL MI所需的路由条目
- 路由表必须开启
- 调整Pulumi代码逻辑
需将NSG、路由表的创建逻辑提前,在子网配置中关联这两个资源,参考代码片段如下:// 创建MI专用NSG var miNsg = new NetworkSecurityGroup("mi-nsg", new NetworkSecurityGroupArgs { ResourceGroupName = mainResourceGroup.Name, SecurityRules = new List<SecurityRuleArgs> { // 补充上述要求的所有入站、出站规则 } }); // 创建MI专用路由表 var miRouteTable = new RouteTable("mi-routetable", new RouteTableArgs { ResourceGroupName = mainResourceGroup.Name, DisableBgpRoutePropagation = false // 必须开启传播网关路由 }); // 子网配置关联NSG、路由表和委托 var spokeManagedInstanceSubnet = new Subnet($"{SpokeVirtualNetwork}.{ManagedInstanceSubnet}", new AzureNative.Network.SubnetArgs { // 保留原有子网配置参数 NetworkSecurityGroupId = miNsg.Id, RouteTableId = miRouteTable.Id, Delegations = new List<DelegationArgs> { new DelegationArgs { Name = "mi-delegation", ServiceName = "Microsoft.Sql/managedInstances" } } }, new CustomResourceOptions { DependsOn = { spokeVnet, miNsg, miRouteTable } }); - 清理残留资源后重新部署
前次部署失败后会残留关联的虚拟集群资源,需要先到对应资源组中删除所有和本次失败部署相关的SQL MI、虚拟集群资源,等待15分钟后再执行pulumi up重新部署,避免残留资源锁定导致部署继续失败。
内容的提问来源于stack exchange,提问作者MD TAREQ HASSAN
相关产品推荐
相关产品推荐

