如何在GCP中调度启停手动缩放的标准环境App Engine?
手动缩放App Engine标准环境定时启停的最佳实现方案
针对你手动缩放的App Engine标准环境定时启停最新版本的需求,以下是可行的优化方案及替代思路:
方案一:优化你现有的Cloud Function方案
你当前用Cloud Function+Cloud Scheduler的思路完全可行,还能进一步简化:
- 无需编写两个独立函数,把启停逻辑整合到单个函数中,通过传入的参数(比如HTTP请求的body参数)区分操作类型。
- 函数内部优先调用App Engine Admin API而非执行
gcloud命令,避免依赖CLI环境,稳定性和效率更高:- 停止版本:调用
apps.services.versions.patch接口,将manual_scaling.instances设为0 - 启动版本:同样调用该接口,把实例数设为你需要的数量(比如1)
- 停止版本:调用
- 给Cloud Function配置
roles/appengine.appAdmin角色,确保具备修改版本配置的权限。
示例Python函数核心逻辑
import googleapiclient.discovery def manage_app_engine_version(request): request_json = request.get_json() action = request_json.get('action') project_id = "你的项目ID" service_id = "你的服务名(默认是default)" # 获取最新版本 appengine = googleapiclient.discovery.build('appengine', 'v1') versions = appengine.apps().services().versions().list( appsId=project_id, servicesId=service_id ).execute() latest_version = max(versions['versions'], key=lambda v: v['createTime']) version_id = latest_version['id'] if action == 'stop': body = {'manualScaling': {'instances': 0}} elif action == 'start': body = {'manualScaling': {'instances': 1}} # 可根据需求调整实例数 else: return "无效操作", 400 # 调用API修改版本配置 appengine.apps().services().versions().patch( appsId=project_id, servicesId=service_id, versionsId=version_id, body=body ).execute() return f"已{action}版本 {version_id}", 200
之后给这个函数创建两个Cloud Scheduler定时任务:
- 停止任务:每日指定夜间时间,发送POST请求到函数URL,请求体携带
{"action": "stop"} - 启动任务:每日指定晨间时间,发送POST请求到函数URL,请求体携带
{"action": "start"}
方案二:Cloud Scheduler直接调用API(无需Cloud Function)
如果不想编写函数,也可以用Cloud Scheduler直接调用App Engine Admin API,但需要提前配置OAuth令牌:
- 创建服务账号并授予
roles/appengine.appAdmin权限 - 在Cloud Scheduler中创建HTTP类型定时任务:
- 请求URL:
https://appengine.googleapis.com/v1/apps/[你的项目ID]/services/[服务名]/versions/[版本ID]:patch - 请求方法:PATCH
- 身份验证选择「OAuth令牌」,关联上述服务账号,作用域填
https://www.googleapis.com/auth/cloud-platform - 请求体根据启停需求设置:停止时为
{"manualScaling": {"instances": 0}},启动时设为对应实例数
- 请求URL:
注意:该方案需要固定版本ID,无法自动适配最新版本,仅适合版本不频繁变更的场景。
方案对比
- 优化后的Cloud Function方案:灵活度高,能自动识别最新版本,逻辑集中易维护,是最推荐的实现方式。
- 直接API调用方案:适合固定版本的启停场景,但版本更新后需手动修改任务配置,灵活性不足。
你的初始方案已经走对了方向,优化后会更高效可靠。
内容的提问来源于stack exchange,提问作者mary
相关产品推荐
相关产品推荐

