如何每日定时启停GCP基础缩放模式的B1 App Engine实例?
可行,具体实现方案如下
完全可以通过Cloud Function配合Cloud Scheduler定时切换App Engine服务的启用/禁用状态,避开凌晨的无效请求,刚好匹配GCP每日18小时的B1免费额度,且无需切换到手动缩放模式。
核心思路
App Engine服务支持设置ENABLED/DISABLED状态:
- 凌晨1点将打卡服务设为
DISABLED:此时所有请求会返回503,不会触发实例启动,彻底避免无效费用 - 早7点将服务恢复为
ENABLED:恢复正常接收打卡请求,保留基础缩放模式的自动启停特性
实现步骤
1. 配置权限
给Cloud Function的执行账号授予App Engine Admin权限:
- 进入GCP控制台的IAM页面,找到Cloud Function默认使用的服务账号(格式类似
PROJECT_ID@appspot.gserviceaccount.com) - 为该账号添加
roles/appengine.appAdmin角色,确保它有权修改App Engine服务状态
2. 编写Cloud Function(Node.js示例)
创建两个函数(或一个函数根据触发时间判断动作),调用App Engine Admin API修改服务状态:
函数1:禁用打卡服务(凌晨1点触发)
const {google} = require('googleapis'); const appengine = google.appengine('v1'); exports.disablePunchService = async (req, res) => { const auth = new google.auth.GoogleAuth({ scopes: ['https://www.googleapis.com/auth/cloud-platform'], }); const client = await auth.getClient(); google.options({auth: client}); const projectId = process.env.GCP_PROJECT; const serviceId = '你的打卡服务ID'; // 替换为实际的App Engine服务ID try { await appengine.apps.services.patch({ name: `apps/${projectId}/services/${serviceId}`, updateMask: 'status', requestBody: { status: 'DISABLED' } }); res.status(200).send('打卡服务已禁用'); } catch (err) { console.error('禁用服务失败:', err); res.status(500).send('禁用服务失败'); } };
函数2:启用打卡服务(早7点触发)
只需将上述代码中的status: 'DISABLED'改为status: 'ENABLED'即可,函数名可改为enablePunchService。
3. 设置定时触发(Cloud Scheduler)
- 进入Cloud Scheduler页面,创建两个定时任务:
- 任务1:Cron表达式设为
0 1 * * *(时区选择Asia/Shanghai),触发目标为上述disablePunchService函数 - 任务2:Cron表达式设为
0 7 * * *,触发目标为enablePunchService函数
- 任务1:Cron表达式设为
注意事项
- 务必确认
serviceId是打卡服务的ID,不要误操作官网的F实例服务 - 测试阶段可手动触发函数,检查App Engine服务状态是否正确切换,避免影响正常打卡
- 禁用服务期间,考勤机的请求会返回503,无需担心重试问题——因为服务不会启动实例处理请求,不会产生额外费用
内容的提问来源于stack exchange,提问作者Oirampok
相关产品推荐
相关产品推荐

