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

求基于标签值的Azure多订阅快照自动创建及7天删除脚本与入门教程

多订阅环境下基于标签创建Azure快照并自动7天后删除的PowerShell脚本

以下是满足需求的PowerShell脚本,支持多订阅环境,基于指定标签筛选磁盘创建快照,并自动清理7天前到期的快照:

# 安装Az模块(首次运行需要)
Install-Module -Name Az -AllowClobber -Force -Scope CurrentUser

# 登录Azure账户(非自动化环境需手动登录)
Connect-AzAccount

# 定义配置变量
$targetTagKey = "SnapshotEnabled"    # 标识需创建快照的磁盘的标签键
$targetTagValue = "True"             # 标签对应的值
$retentionDays = 7                   # 快照保留天数,到期自动删除
$snapshotSuffix = "_AutoSnapshot"    # 快照名称后缀,便于识别

# 遍历所有有权限的订阅
Get-AzSubscription | ForEach-Object {
    Write-Host "`n=== 切换到订阅: $($_.Name) (ID: $($_.Id)) ==="
    Select-AzSubscription -SubscriptionObject $_ | Out-Null

    # 获取当前订阅中符合标签条件的磁盘
    $targetDisks = Get-AzDisk | Where-Object {
        $_.Tags.ContainsKey($targetTagKey) -and $_.Tags[$targetTagKey] -eq $targetTagValue
    }

    # 为符合条件的磁盘创建快照
    foreach ($disk in $targetDisks) {
        $snapshotName = "$($disk.Name)$snapshotSuffix"
        $snapshotConfig = New-AzSnapshotConfig `
            -SourceUri $disk.Id `
            -CreateOption Copy `
            -Location $disk.Location
        
        # 给快照添加标签:记录原磁盘信息和到期日期
        $expiryDate = (Get-Date).AddDays($retentionDays).ToString("yyyy-MM-dd")
        $snapshotTags = $disk.Tags.Clone()
        $snapshotTags["OriginalDiskName"] = $disk.Name
        $snapshotTags["SnapshotExpiryDate"] = $expiryDate

        Write-Host "正在为磁盘 $($disk.Name) 创建快照: $snapshotName"
        New-AzSnapshot `
            -Snapshot $snapshotConfig `
            -SnapshotName $snapshotName `
            -ResourceGroupName $disk.ResourceGroupName `
            -Tag $snapshotTags | Out-Null
    }

    # 清理当前订阅中到期的快照
    Write-Host "`n=== 清理当前订阅中到期的快照 ==="
    $currentDate = Get-Date
    $allSnapshots = Get-AzSnapshot

    foreach ($snapshot in $allSnapshots) {
        # 优先按快照的到期标签判断
        if ($snapshot.Tags.ContainsKey("SnapshotExpiryDate")) {
            $expiryDate = [DateTime]$snapshot.Tags["SnapshotExpiryDate"]
            if ($expiryDate -lt $currentDate) {
                Write-Host "删除过期快照: $($snapshot.Name) (到期日期: $expiryDate)"
                Remove-AzSnapshot `
                    -ResourceGroupName $snapshot.ResourceGroupName `
                    -SnapshotName $snapshot.Name `
                    -Force | Out-Null
            }
        }
        # 兼容无标签的旧快照,按创建时间计算保留期
        elseif ($snapshot.TimeCreated.AddDays($retentionDays) -lt $currentDate) {
            Write-Host "删除旧快照: $($snapshot.Name) (创建时间: $($snapshot.TimeCreated))"
            Remove-AzSnapshot `
                -ResourceGroupName $snapshot.ResourceGroupName `
                -SnapshotName $snapshot.Name `
                -Force | Out-Null
        }
    }
}

关键功能说明

  • 多订阅支持:通过Get-AzSubscription遍历所有有权限的订阅,使用Select-AzSubscription切换上下文
  • 标签筛选逻辑:仅对带有指定键值对标签(示例为SnapshotEnabled=True)的磁盘创建快照,可修改$targetTagKey和$targetTagValue适配你的标签规则
  • 自动过期机制:创建快照时添加SnapshotExpiryDate标签记录到期时间,清理时优先按该标签判断;同时兼容无标签的旧快照,按创建时间计算保留期
  • 可配置参数:所有核心参数都集中在脚本开头,便于根据实际需求调整

使用提示

  1. 首次运行需确保当前用户具备目标订阅的磁盘访问权限,以及快照的创建/删除权限
  2. 若要自动化执行,可将脚本部署到Azure自动化账户,配置每日定时触发器
  3. 建议先在测试环境验证脚本功能,避免误删资源

内容的提问来源于stack exchange,提问作者Madhur Asati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:23:13