You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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令牌:

  1. 创建服务账号并授予roles/appengine.appAdmin权限
  2. 在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}},启动时设为对应实例数

注意:该方案需要固定版本ID,无法自动适配最新版本,仅适合版本不频繁变更的场景。

方案对比

  • 优化后的Cloud Function方案:灵活度高,能自动识别最新版本,逻辑集中易维护,是最推荐的实现方式。
  • 直接API调用方案:适合固定版本的启停场景,但版本更新后需手动修改任务配置,灵活性不足。

你的初始方案已经走对了方向,优化后会更高效可靠。

内容的提问来源于stack exchange,提问作者mary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:37:26