如何通过编程方式删除Azure资源组中除指定资源外的所有内容
实现方案
原有代码报错原因
- ARM模板的resources字段要求每个资源项必须包含
type、name、apiVersion三个必填属性,直接传入Get-AzResource返回的完整资源对象不符合格式要求,所以触发请求无效报错 - 原有代码仅将存储账户加入保留列表,遗漏了需要保留的Key Vault资源
- 未指定部署模式为
Complete,默认的增量部署模式不会删除模板中未定义的资源,即使格式正确也无法达到清理效果
方案1:基于ARM完整模式部署实现(匹配你的原有思路)
正确的PowerShell代码如下:
# 定义资源组名称 $rgName = "MyAppRG" # 获取需要保留的存储账户和Key Vault资源 $keepResources = @( Get-AzStorageAccount -ResourceGroupName $rgName | Get-AzResource Get-AzKeyVault -ResourceGroupName $rgName | Get-AzResource ) # 构造符合ARM规范的资源定义数组 $armResources = $keepResources | ForEach-Object { @{ type = $_.ResourceType name = $_.Name apiVersion = $_.ApiVersion } } # 构造ARM模板 $emptyArmTemplate = @{ "`$schema" = "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#" contentVersion = "1.0.0.0" resources = $armResources } # 执行完整模式部署,仅保留模板中定义的资源 New-AzResourceGroupDeployment -Name "cleanup-deployment" ` -ResourceGroupName $rgName ` -TemplateObject $emptyArmTemplate ` -Mode Complete ` -Force
方案2:直接筛选删除非目标资源(更简单易用)
如果你不需要用ARM模板的方式,可以直接过滤资源组内的资源,排除需要保留的类型后直接删除,逻辑更直观:
$rgName = "MyAppRG" # 筛选排除存储账户和Key Vault之外的所有资源 $resourcesToDelete = Get-AzResource -ResourceGroupName $rgName | Where-Object { $_.ResourceType -ne "Microsoft.Storage/storageAccounts" -and $_.ResourceType -ne "Microsoft.KeyVault/vaults" } # 批量删除资源,可先加-WhatIf参数预览要删除的资源 $resourcesToDelete | Remove-AzResource -Force
注意事项
- 执行删除操作前建议先添加
-WhatIf参数预览操作结果,确认删除列表符合预期避免误删 - 如果资源配置了删除锁,需要先移除删除锁后才能完成删除
- 若Key Vault开启了软删除特性,删除后资源会保留在软删除列表中,需要额外执行清除操作才能彻底释放资源名称
内容的提问来源于stack exchange,提问作者Hydromast
相关产品推荐
相关产品推荐

