微软云 Azure 微软云快照自动创建
话说某天凌晨两点,小张盯着屏幕,手指悬在回车键上,额头沁出细汗——他刚误删了生产环境数据库的主数据盘。三秒后,他猛拍大腿:“快照!我上周设的自动快照呢?!”
五分钟后,他瘫在椅子上,眼神空洞,嘴里喃喃:“……原来快照没开自动,只开了手动。”
这事儿后来成了他们部门团建时的保留节目,叫《快照不是备份,但比老板的承诺更靠不住》。
一、先泼盆冷水:快照 ≠ 备份,它只是“硬盘的自拍”
别急着抄代码,咱得先破个幻觉:Azure 快照不是备份,它是一张“只读、增量、依赖源磁盘”的硬盘快照——说白了,就是给磁盘拍张高清自拍,但照片底片还连着原相机(源磁盘)。一旦源磁盘被删、损坏或权限被误关,快照立马变废片,连缩略图都打不开。
类比一下:快照是你的微信聊天记录截图;备份是你把整段对话导出成PDF+存网盘+发邮箱+刻光盘+念给猫听(多重冗余)。截图丢了,聊天还在;快照挂了,数据可能真就随风而逝了。
所以,快照的正经定位是:快速恢复的缓冲垫 + 磁盘变更前的保险绳 + 运维人的临时定心丸,而不是“删库跑路后还能笑着领年终奖”的终极兜底方案。
二、自动快照怎么搞?三步走,不写论文,只写能跑的脚本
Azure 官方没提供“一键开启自动快照”的按钮(大概怕用户点完以为万事大吉),但给了你一把瑞士军刀——PowerShell + Azure CLI + 定时任务。我们选最接地气的组合:PowerShell 脚本 + Azure Automation(免费层够用)。
Step 1|准备快照身份证
给每块要保护的磁盘打上标签,比如:AutoSnapshot=Yes、RetentionDays=7、Timezone=Asia/Shanghai。别小看这仨标签——它们是你脚本的“眼睛”,让程序知道“谁该拍”“拍多久”“几点拍”。
Step 2|抄一段“能活过测试”的脚本
以下不是伪代码,是实测过、带注释、防手抖的 PowerShell(已去敏,可直接改名运行):
# 登录(Automation账户自带上下文,本地运行需加 Connect-AzAccount)
$rgName = "prod-rg"
$location = "East Asia"
$timestamp = Get-Date -Format "yyyyMMdd-HHmmss"
# 找所有带 AutoSnapshot=Yes 的托管磁盘
$disks = Get-AzDisk -ResourceGroupName $rgName | Where-Object {
$_.Tags.AutoSnapshot -eq "Yes" -and $_.ManagedBy
}
foreach ($disk in $disks) {
$snapshotName = "$($disk.Name)-snap-$timestamp"
$snapshotConfig = New-AzSnapshotConfig -SourceUri $disk.Id `
-Location $location `
-CreateOption Copy `
-Tag @{"CreatedBy"="AutoSnap"; "OriginDisk"=$disk.Name}
# 创建快照(注意:同一区域同名快照会冲突,所以带时间戳)
$null = New-AzSnapshot -SnapshotName $snapshotName `
-Snapshot $snapshotConfig `
-ResourceGroupName $rgName
Write-Output "✅ 已创建快照:$snapshotName"
# 清理 N 天前的旧快照(按 RetentionDays 标签)
$retention = [int]$disk.Tags.RetentionDays
$cutoff = (Get-Date).AddDays(-$retention)
Get-AzSnapshot -ResourceGroupName $rgName |
Where-Object { $_.Tags.OriginDisk -eq $disk.Name -and $_.TimeCreated -lt $cutoff } |
ForEach-Object { Remove-AzSnapshot -ResourceGroupName $rgName -SnapshotName $_.Name -Force }
}
Step 3|让它自己醒、自己干、自己睡
扔进 Azure Automation Account,新建一个 Runbook(PowerShell 类型),粘贴保存,再配个 Schedule:比如每天凌晨 2:15(避开业务高峰+留出 15 分钟容错窗口)。记得勾选“启用”——很多兄弟卡在这一步,脚本写得飞起,定时器却灰着,像买了闹钟没上发条。
三、血泪教训:那些让自动快照“自动失联”的坑
- 坑一|跨区域快照失效:快照必须和源磁盘在同一区域。你在上海资源组里建的磁盘,快照不能存在北京区域——Azure 不支持“异地自拍”,强行指定会报错“LocationMismatch”,不是权限问题,是地理学问题。
- 坑二|标签大小写敏感:
autotag=yes≠AutoSnapshot=Yes。PowerShell 严格区分大小写,建议统一用 PascalCase 写法,团队 Wiki 里标红加粗:“标签名,不许拼音首字母小写!” - 坑三|快照计费静悄悄:每个快照按实际占用空间计费(非磁盘容量),但如果你删了源磁盘,所有关联快照立刻转为“独立快照”,开始按全量计费——一夜之间账单翻倍,财务部电话打爆你手机。
- 坑四|脚本跑一半崩了:没加错误处理的脚本,遇到一块磁盘权限异常,整个循环戛然而止。补一句
try {…} catch {Write-Warning "跳过磁盘 $($disk.Name),原因:$($_.Exception.Message)"},世界瞬间安静。
四、快照之后呢?别忘了“快照的快照”
自动快照解决了“随时可回滚”,但没解决“灾难级丢失”。所以建议搭配:快照(小时级恢复)+ Azure Backup(策略化备份,支持跨区域、加密、合规审计)+ 导出 VHD 到 Blob 存储(冷备,便宜到像白捡)。三者不是替代关系,是保安(快照)、保镖(Backup)、保险柜(VHD归档)的黄金三角。
顺便说,Blob 存储的 Archive 层,存一份快照导出的 VHD,一年费用≈一杯奶茶钱——而它能在你遭遇勒索病毒、误格式化、甚至整个资源组被删时,成为最后的救命稻草。
微软云 Azure 五、结尾彩蛋:运维人的自我修养
最后送大家三条快照生存守则:
- 每月手动触发一次恢复测试:选个快照,新建虚拟机挂上去,登录进去看看 /etc/passwd 是否完整。不试,永远不知道快照是不是“看起来很美”。
- 快照命名带上业务含义:别叫
disk01-snap-20240520,改成payment-db-os-snap-pre-patch-v2.3.1——下次半夜救火,你不会对着二十个时间戳快照抓狂。 - 在钉钉/企业微信建个「快照日报」机器人:每天早八点推送:“昨日成功创建 7 个快照,清理过期快照 3 个,无失败项 ✅”。仪式感拉满,安全感自来。
回到开头那个凌晨两点的小张——他后来写了份《快照 SOP》,贴在工位玻璃上,标题加粗加红:“快照不背锅,但它愿意陪你扛第一波压力。”
技术没有银弹,但有快照;世界充满意外,但有准备。祝你每次 New-AzSnapshot 都返回绿色 ✅,每次 Remove-AzSnapshot 都心里踏实,每次深夜告警,都能淡定回一句:“别慌,我有快照,还有咖啡。”

