如何用PowerShell获取Azure资源修改时间并自动化清理闲置资源
Azure资源生命周期自动化脚本(90天未活跃资源清理+活跃资源统计)
核心PowerShell脚本
注意:请确保已安装并切换至Azure Az模块(AzureRm已被官方弃用,建议升级),执行前先通过Connect-AzAccount完成身份验证。
# 定义时间阈值:90天前 $thresholdDate = (Get-Date).AddDays(-90) # 获取订阅下所有资源 $allResources = Get-AzResource # 初始化结果数组 $activeResources = @() $inactiveResources = @() foreach ($resource in $allResources) { # 获取该资源最近的活动日志(限制返回1条最新记录) $latestActivity = Get-AzLog -ResourceId $resource.ResourceId -MaxEvents 1 -WarningAction SilentlyContinue if ($latestActivity) { $lastActivityDate = $latestActivity.EventTimestamp # 判断是否在90天内有活动 if ($lastActivityDate -ge $thresholdDate) { $activeResources += [PSCustomObject]@{ ResourceName = $resource.Name ResourceId = $resource.ResourceId LastModifiedTime = $lastActivityDate ResourceType = $resource.ResourceType } } else { $inactiveResources += $resource } } else { # 无日志记录的资源视为未活跃 $inactiveResources += $resource } } # 输出活跃资源信息到CSV文件 $activeResources | Export-Csv -Path "ActiveAzureResources_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation -Encoding UTF8 # 输出待处理的未活跃资源信息到CSV文件 $inactiveResources | Select-Object Name, ResourceId, ResourceType, Location | Export-Csv -Path "InactiveAzureResources_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation -Encoding UTF8 # 控制台输出统计结果 Write-Host "=== 统计结果 ===" Write-Host "活跃资源数量: $($activeResources.Count)" Write-Host "90天未活跃资源数量: $($inactiveResources.Count)" Write-Host "活跃资源详情已导出至: ActiveAzureResources_$(Get-Date -Format 'yyyyMMdd').csv" Write-Host "待处理资源详情已导出至: InactiveAzureResources_$(Get-Date -Format 'yyyyMMdd').csv"
脚本扩展:批量处理未活跃资源
如果需要直接对未活跃资源执行弃用/迁移操作,可在上述脚本末尾添加以下逻辑(请务必先测试,确认无误后再执行):
# 示例:标记未活跃资源为删除(仅演示,实际操作请替换为你的弃用/迁移逻辑) foreach ($inactiveResource in $inactiveResources) { Write-Host "标记资源 $($inactiveResource.Name) 待删除..." # 执行删除操作(注释掉的是实际命令,取消注释前请确认) # Remove-AzResource -ResourceId $inactiveResource.ResourceId -Force }
自动执行配置(每15天运行一次)
方案1:Windows任务计划
- 将脚本保存为
AzureResourceCleanup.ps1 - 创建新任务,设置触发器为"每15天",选择合适的执行时间
- 操作设置为启动程序,程序/脚本选择
powershell.exe,添加参数:-ExecutionPolicy Bypass -File "C:\Scripts\AzureResourceCleanup.ps1" - 配置任务运行的账户需具备Azure订阅的资源参与者或更高权限,且已通过
Save-AzContext保存持久化登录上下文
方案2:Azure Automation Runbook
- 在Azure门户创建Automation账户,导入Az模块
- 创建PowerShell Runbook,粘贴上述核心脚本
- 添加计划触发器,设置为每15天执行一次
- 为Automation账户分配具备相应权限的托管身份,避免手动登录
注意事项
- 权限要求:执行脚本的账户需要
Microsoft.Insights/logs/read和Microsoft.Resources/resources/read权限,若需删除资源则需Microsoft.Resources/resources/delete权限 - 日志可用性:部分Azure资源的活动日志可能仅保留90天内的记录,无日志的资源会被判定为未活跃,请根据实际场景调整逻辑
- 测试优先:在批量执行删除/迁移操作前,务必先通过导出的CSV文件验证未活跃资源列表,避免误删关键资源
- Az模块升级:若仍在使用
AzureRm模块,可将脚本中的Get-Az*替换为Get-AzureRm*,但强烈建议升级至Az模块以获得官方支持
内容的提问来源于stack exchange,提问作者Dwara
相关产品推荐
相关产品推荐

