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

Pulumi执行destroy时出现Subnet is in use无法删除问题如何解决

问题根因

你遇到的删除顺序异常本质是Pulumi无法正确识别资源依赖链,核心问题出在代码写法:你在Apply()回调函数内部创建了虚拟网络、子网资源,Pulumi的静态依赖分析能力无法追踪到嵌套在Apply回调内的资源依赖关系,因此销毁时不会按你预期的「子网→虚拟网络→资源组」顺序执行,而是会并行/乱序删除资源,就出现了资源被占用无法删除的报错。

修复方案

1. 修正资源创建写法(根本解决)

Pulumi资源的入参原生支持Output<T>类型,不需要手动调用Apply()获取值再创建资源,直接把上游资源的Output属性作为入参传入即可,Pulumi会自动建立依赖关系:

// 原代码保留部分省略
var mainResourceGroup = new ResourceGroup(MainResourceGroup, new ResourceGroupArgs {
    ResourceGroupName = mainRgName,
    Tags = mainRgTags
});

// 直接创建虚拟网络,不需要套Apply,传入资源组的Output属性即可自动建立依赖
var spokeVnet = new VirtualNetwork(SpokeVirtualNetwork, new VirtualNetworkArgs {
    ResourceGroupName = mainResourceGroup.Name,
    VirtualNetworkName = spokeVnetName,
    AddressSpace = new AddressSpaceArgs {
        AddressPrefixes = spokeVnetAddressPrefixes
    },
    Tags = spokeVnetTags
});

// 直接创建子网,传入虚拟网络、资源组的Output属性,自动建立依赖
var subnetName = AksApplicationSubnet;
var subnets = spokeVnetArgs.GetSubnets() ?? new Dictionary<string, string>();
if (!subnets.ContainsKey(subnetName)) {
    throw new PulumiArgumentException($"Value is not set for {nameof(subnetName)}");
}
var subnetCidr = subnets[subnetName];
var spokeAksAppSubnet = new Subnet($"{spokeVnet.Name.Apply(n=>n)}.{subnetName}", new AzureNative.Network.SubnetArgs {
    SubnetName = subnetName,
    AddressPrefix = subnetCidr,
    VirtualNetworkName = spokeVnet.Name,
    ResourceGroupName = mainResourceGroup.Name,
});

改完后重新执行一次pulumi up更新栈状态,后续pulumi destroy就会按正确顺序删除资源。

2. 显式声明依赖(兼容原有写法)

如果你不想调整现有代码结构,也可以在创建资源时手动通过DependsOn参数显式指定依赖:

// 创建子网时指定依赖虚拟网络
return new Subnet($"{vnetUniqueName}.{subnetName}", new AzureNative.Network.SubnetArgs {
    // 参数省略
}, new CustomResourceOptions {
    DependsOn = new Resource[] { vnet }
});

3. 加长慢删除资源的超时时间

针对Application Gateway这类删除耗时较长的Azure资源,单独配置删除超时时间,避免Pulumi提前执行后续删除操作:

new ApplicationGateway("你的网关名称", new ApplicationGatewayArgs {
    // 参数省略
}, new CustomResourceOptions {
    CustomTimeouts = new CustomTimeouts {
        Delete = TimeSpan.FromMinutes(30)
    }
});

4. 临时销毁方案

如果当下需要立即销毁栈,可以分步骤执行删除:

  1. 先单独删除网关资源:pulumi destroy -t <网关资源的URN>(URN可以通过pulumi stack export查看)
  2. 等网关删除完成后,再执行全量销毁:pulumi destroy -s dev

内容的提问来源于stack exchange,提问作者MD TAREQ HASSAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:24:04