谷歌云台湾账号 GCP谷歌云快照自动创建
你有没有在凌晨三点被一条 Slack 消息惊醒:「数据库磁盘挂了,快照是三天前的」?
然后你一边灌第三杯咖啡,一边翻着文档找 gcloud compute snapshots create 的拼写——结果发现,上次手动快照还是上个月你顺手点的,而「自动化」这个词,至今还躺在你待办清单第17条,标注着「重要但不紧急」。
别慌。今天这顿操作,不用写 shell 脚本,不装 cron,不搭 VM,不买监控 SaaS。我们用 GCP 自家的积木块,搭一套「安静又靠谱」的自动快照流水线——它会在每天凌晨2:17(你说了算)准时咔嚓一声,给指定磁盘拍张高清写真,存进 Google Cloud Storage,顺便发条日志说「我干完了,没出岔子」。
核心就三块乐高:Cloud Scheduler(闹钟)、Cloud Functions(勤快小工)、Service Account(带钥匙的门禁卡)。全程 Web 控制台点点点 + 一丢丢 Python,20 分钟上线,后续零维护。
第一步:先给小工配把「万能钥匙」
Cloud Functions 运行时没有默认权限——它不是你的马甲,不能随便进你的磁盘仓库。得专门发张「工作证」:
- 进 IAM & Admin → Service Accounts;
- 点「+ 创建服务账号」,起名比如
[email protected]; - 分配角色:
Compute Instance Admin (v1)+Compute Snapshot Admin(别贪心加 Owner!最小权限原则,防误删); - 跳过密钥生成(我们用默认凭据,更安全)。
⚠️ 关键细节:创建完别急着走!点开这个账号 → 「权限」页 → 点「+ 添加角色」→ 加上 Service Account Token Creator。否则 Functions 调用 Compute API 时会报 403 Permission denied——这是 GCP 最爱埋的彩蛋之一。
第二步:写个「快照小纸条」——Python 函数
新建 Cloud Function(HTTP 触发器),运行时选 Python 3.11,内存设 512MB(够用不浪费),服务账号选刚建好的那个。
函数代码(直接复制粘贴,改两处即可):
import os
import google.auth
from google.cloud import compute_v1
from google.auth import default
def create_disk_snapshot(request):
# 解析请求参数(可选:支持传 disk 名/zone/项目)
request_json = request.get_json(silent=True)
disk_name = request_json.get('disk') or os.environ.get('DISK_NAME')
zone = request_json.get('zone') or os.environ.get('DISK_ZONE', 'us-central1-a')
project_id = os.environ.get('GCP_PROJECT')
if not disk_name:
return ('Missing disk name', 400)
# 初始化客户端
credentials, _ = default()
client = compute_v1.DisksClient(credentials=credentials)
# 构造快照名称:diskname-20240520-0217
from datetime import datetime
timestamp = datetime.now().strftime('%Y%m%d-%H%M')
snapshot_name = f'{disk_name}-{timestamp}'
# 配置快照参数
snapshot_body = compute_v1.Snapshot(
name=snapshot_name,
description=f'Auto-created by Cloud Scheduler at {timestamp}',
labels={'auto': 'true', 'source': disk_name},
storage_locations=['us'] # 可选:多区域存储,防单点故障
)
try:
# 发起异步创建请求
operation = client.create_snapshot(
project=project_id,
zone=zone,
disk=disk_name,
snapshot_resource=snapshot_body
)
# 等待完成(最大 300 秒,避免超时)
operation.result(timeout=300)
return f'Snapshot {snapshot_name} created successfully.', 200
except Exception as e:
# 记录详细错误(日志里可查)
import logging
logging.error(f'Failed to create snapshot for {disk_name}: {str(e)}')
return f'Error: {str(e)}', 500
部署时,在「环境变量」里填:GCP_PROJECT = 你的项目 IDDISK_NAME = 你要备份的磁盘名(如 my-db-disk)DISK_ZONE = 磁盘所在可用区(如 us-central1-b)
✅ 验证方法:点「测试函数」,送个空 JSON {},看返回 200 和快照名——成!
第三步:安个「智能闹钟」——Cloud Scheduler
进 Cloud Scheduler → 创建作业:
- 名称:比如
daily-disk-snapshot; - 频率:填
0 17 2 * * *(注意:GCP 用秒级 cron,格式是秒 分 时 日 月 星期 年,所以凌晨 2:17 是0 17 2 * * *); - 目标:选「HTTP」;
- 谷歌云台湾账号 URL:粘贴你刚部署的 Function 的触发 URL(形如
https://us-central1-your-proj.cloudfunctions.net/snapshot-func); - HTTP 方法:POST;
- 身份验证:选「使用服务账号令牌」→ 选你创建的
snapshot-worker@...; - 超时:设 600 秒(快照可能要 3–5 分钟)。
💡 小技巧:第一次跑失败?别急着删重来。进「作业详情」→ 「查看最近运行」→ 点失败记录 → 查「日志」链接,错误一目了然(常见原因:磁盘名拼错、zone 不匹配、权限漏加)。
第四步:让它「知错能改」——加个重试兜底
Cloud Scheduler 原生支持失败重试!在作业编辑页拉到最下面:
勾选「启用重试」→ 设置「最大重试次数」为 3 → 「退避倍数」1.5 → 「初始退避」30 秒。
意思是:第一次失败等 30 秒重试,第二次等 45 秒,第三次等 67 秒……避免雪崩式重试打爆 API。
第五步:盯紧它——日志在哪看?
所有快照动作都记在 Logging → 日志浏览器:
筛选器输入:resource.type="cloud_function"
logName:"cloudfunctions.googleapis.com%2Fcloud-functions"
severity>=INFO
就能看到每次调用时间、快照名、耗时、是否成功。想导出?点右上角「导出」→「导出到 BigQuery」或「下载 CSV」,老板要周报时直接甩表格。
进阶锦囊(可选但强烈推荐)
- 多磁盘批量快照:改函数逻辑,读取一个磁盘列表(存 Cloud Storage JSON 文件),循环创建;
- 自动清理旧快照:再写个 Functions,每周一早上扫描标签
auto:true且超过 7 天的快照,调用delete(); - 微信/钉钉告警:函数末尾加几行,调用企业 webhook,失败时发「快照告急!」消息;
- 成本监控:快照按 GB/天计费,进「Billing → 报告」,过滤
compute.snapshots,设置预算提醒。
最后送你一句 GCP 老司机私藏口诀:
「权限先给足,名字别手抖,日志天天瞅,重试必须有。」
现在,关掉这篇教程,去控制台点几下——20 分钟后,你就能安心睡个整觉了。毕竟,真正的运维自由,不是不用管,而是知道它正 quietly doing its job,像冰箱里的灯,你不开门,它也亮着。

