如何通过Cloud Functions将Cloud SQL生产实例最新备份恢复至staging实例?
自动化将Cloud SQL生产实例备份恢复至Staging实例方案
一、前置准备与权限配置
- 启用Cloud SQL Admin API:在GCP控制台的API库中搜索并启用「Cloud SQL Admin API」
- 配置Cloud Functions服务账号权限:
- 为Cloud Functions默认服务账号(
PROJECT_ID@appspot.gserviceaccount.com)添加Cloud SQL Admin角色,或更精细化的权限:cloudsql.instances.restoreBackup:允许恢复备份到实例cloudsql.backups.list:允许列出生产实例的备份cloudsql.instances.get:允许获取实例信息
- 为Cloud Functions默认服务账号(
二、创建Cloud Functions函数(Python示例)
创建一个HTTP触发的Cloud Functions,核心逻辑是获取生产实例的最新备份,再恢复到Staging实例:
from googleapiclient import discovery from oauth2client.client import GoogleCredentials def restore_prod_backup_to_staging(request): # 替换为你的GCP项目ID、生产/Staging实例名称 PROJECT_ID = "your-gcp-project-id" PROD_INSTANCE = "production" STAGING_INSTANCE = "staging" # 初始化SQL Admin客户端 credentials = GoogleCredentials.get_application_default() sql_admin = discovery.build('sqladmin', 'v1', credentials=credentials) # 1. 获取生产实例的所有备份,按创建时间倒序排序 backups_response = sql_admin.backups().list( project=PROJECT_ID, instance=PROD_INSTANCE ).execute() if not backups_response.get('items'): return "生产实例无可用备份", 400 # 获取最新备份(第一个元素是最新的) latest_backup = backups_response['items'][0] backup_id = latest_backup['id'] backup_time = latest_backup['startTime'] # 2. 调用恢复API,将最新备份恢复到Staging实例 restore_request = { "restoreBackupContext": { "backupId": backup_id, "instanceId": PROD_INSTANCE, "project": PROJECT_ID } } try: response = sql_admin.instances().restoreBackup( project=PROJECT_ID, instance=STAGING_INSTANCE, body=restore_request ).execute() return f"已触发恢复任务:将生产实例[{PROD_INSTANCE}]的备份({backup_id},创建于{backup_time})恢复至Staging实例[{STAGING_INSTANCE}]", 200 except Exception as e: return f"恢复任务失败:{str(e)}", 500
三、配置Cloud Scheduler触发
- 在GCP控制台创建Cloud Scheduler任务:
- 选择「HTTP」作为目标类型,输入Cloud Functions的触发URL
- 请求方法选择「POST」,请求体可留空
- 设置触发频率的Cron表达式(示例:每周一、三、五凌晨2点触发:
0 2 * * 1,3,5,可根据需求调整) - 身份验证选择「服务账号」,使用具有调用Cloud Functions权限的账号(如Cloud Scheduler默认服务账号,需添加
Cloud Functions Invoker角色)
注意事项
- 恢复操作会重启Staging实例,且会覆盖现有数据,请确保Staging实例的业务可接受此操作
- 若生产实例备份较多,可在代码中添加过滤条件(如仅选择最近24小时内的备份)
- 可扩展函数逻辑,添加错误告警(如通过Pub/Sub发送告警消息)
内容的提问来源于stack exchange,提问作者Jonathan Lazarus
相关产品推荐
相关产品推荐

