谷歌云台湾账号 GCP谷歌云快照自动创建

谷歌云GCP / 2026-04-17 19:55:22

你有没有在凌晨三点被一条 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 运行时没有默认权限——它不是你的马甲,不能随便进你的磁盘仓库。得专门发张「工作证」:

  1. IAM & Admin → Service Accounts
  2. 点「+ 创建服务账号」,起名比如 [email protected]
  3. 分配角色:Compute Instance Admin (v1) + Compute Snapshot Admin(别贪心加 Owner!最小权限原则,防误删);
  4. 跳过密钥生成(我们用默认凭据,更安全)。

⚠️ 关键细节:创建完别急着走!点开这个账号 → 「权限」页 → 点「+ 添加角色」→ 加上 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 = 你的项目 ID
DISK_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,像冰箱里的灯,你不开门,它也亮着。

下载.png
Telegram售前客服
客服ID
@cloudcup
联系
Telegram售后客服
客服ID
@yanhuacloud
联系