AWS服务器内部价 亚马逊云服务器如何设置定时自动开机和关机
亚马逊云服务器如何设置定时自动开机和关机(含实操步骤、成本与风控要点)
多数人搜索这个问题的核心目的只有两个:白天要用、晚上关闭,尽量少花钱;并且不影响业务、别被风控拦截。我下面直接给可落地的几种方案、各自适用场景、账号与支付差异、成本核算、常见故障和风控注意。
先给结论:三条落地路径(按复杂度由低到高)
- 方案A:EventBridge Scheduler 直接调 EC2 API 开/关机
- 适用:少量固定实例(≤50台),不追求按标签分组。
- 优点:无需写代码,控制台全点选。
- 要点:两个计划任务(启动/停止),绑定实例ID。
- 方案B:标签 + Lambda(推荐做法)
- 适用:多台、按组管理(工作日/周末/不同时区),需要按标签筛选。
- 优点:按标签批量管理,后续扩容/变更灵活。
- 要点:Lambda 扫描特定标签,批量 Start/Stop,Scheduler 定时触发。
- 方案C:Auto Scaling 计划动作(仅适用于 ASG)
- 适用:本就用 Auto Scaling Group 管理的无状态实例。
- 优点:直接调整期望容量。
- 要点:适合 Web/EKS 节点等无状态,单机型或需要保留同一实例ID的不适合。
方案A:EventBridge Scheduler 直接开/关 EC2(零代码)
不写代码也能做自动定时。流程如下:
- 前提检查
- 实例必须是 EBS 启动(EBS-backed)。早期仅 instance-store 的 AMI 不能“停止”,只能“终止”。
- 实例所处 Region 和你创建定时任务的 Region 必须一致。
- 如果实例加密卷的 KMS Key 被禁用,会导致无法启动。
- 创建用于调 EC2 API 的 IAM 角色
- 信任实体:scheduler.amazonaws.com(EventBridge Scheduler)。
- 权限策略:最小化授予 ec2:StartInstances、ec2:StopInstances,限定具体实例ID。
- 在控制台创建两个 Scheduler 计划(以北京时区工作日 9:00 开机、19:00 关机为例)
- 进入 EventBridge Scheduler → Create schedule。
- 选择周期类型:
- 建议使用 Cron 表达式并显式选择 Asia/Shanghai 时区(Scheduler 支持时区;旧的 CloudWatch Events 默认 UTC,容易错时区)。
- AWS服务器内部价 启动计划(工作日9点):cron(0 9 ? * MON-FRI *),Time zone 选 Asia/Shanghai。
- 目标(Target):选择 AWS API → EC2 → StartInstances,Input 中填实例ID数组。
- 选择上一步创建的 IAM 角色。
- 再创建一个停止计划(工作日19点):cron(0 19 ? * MON-FRI *) → EC2 StopInstances。
- 建议设置重试策略(例如 2 次、间隔 5 分钟)和死信队列(便于排障)。
适合人群:研发环境、测试环境、PoC,实例数量较少且实例清单稳定。
方案B:标签 + Lambda + Scheduler(可扩展、可分组,推荐)
当你有多台实例、不同班次/时区/周末策略时,按标签管理更省心。
- 给实例打标签
- 示例:Key=Schedule, Value=workday-9-19;另一个分组 Key=Schedule, Value=nights-only。
- 给需要纳入自动管控的实例统一打上有意义的标记。
- 创建 IAM 角色(给 Lambda 用)
- 最小权限:ec2:DescribeInstances、ec2:StartInstances、ec2:StopInstances。
- 可按资源限制到特定标签(基于条件键 ec2:ResourceTag/Schedule),避免误操作其它实例。
- AWS服务器内部价 部署 Lambda 函数(Python 示例,按标签启动/停止)
import boto3
import os
ec2 = boto3.client('ec2')
TAG_KEY = os.environ.get('TAG_KEY', 'Schedule')
TAG_VALUE = os.environ.get('TAG_VALUE', 'workday-9-19')
ACTION = os.environ.get('ACTION', 'start') # start or stop
BATCH = int(os.environ.get('BATCH', '20'))
def handler(event, context):
filters = [
{'Name': f'tag:{TAG_KEY}', 'Values': [TAG_VALUE]},
{'Name': 'instance-state-name', 'Values': ['stopped' if ACTION=='start' else 'running']}
]
paginator = ec2.get_paginator('describe_instances')
to_change = []
for page in paginator.paginate(Filters=filters):
for r in page.get('Reservations', []):
for i in r.get('Instances', []):
to_change.append(i['InstanceId'])
# 分批,避免 API 限流
for i in range(0, len(to_change), BATCH):
batch = to_change[i:i+BATCH]
if not batch:
continue
if ACTION == 'start':
ec2.start_instances(InstanceIds=batch, DryRun=False)
else:
ec2.stop_instances(InstanceIds=batch, DryRun=False)
return {'changed': len(to_change), 'action': ACTION}
- 创建两个 Scheduler 计划
- 启动计划:触发 Lambda,环境变量 ACTION=start。
- 停止计划:触发 Lambda,环境变量 ACTION=stop。
- 不同班次/时区建不同计划,并用不同 TAG_VALUE 管理不同实例组。
进阶优化:
- 在函数中加入 CloudWatch 日志,记录每次变更数量与实例ID,便于核对。
- AWS服务器内部价 并发控制与 API 节流:分批 20 台一组足够稳妥。
- 开关机顺序:涉及依赖时(先开 RDS 后开 EC2),配置多条计划并设定时间间隔(例如相差 10 分钟)。
方案C:Auto Scaling 计划动作(ASG 环境)
如果实例本来由 Auto Scaling Group 管理,不要用 StopInstances,直接用计划动作调整期望容量:
- 在 ASG → Scheduled actions,工作日 9:00 将 Desired/Min/Max 设为目标值(例如 3/3/3);19:00 设为 0/0/0。
- 注意:ASG 会按 Launch Template 重建实例,无法保证是“同一台机器”;适合无状态应用或容器节点。
- 有固定 EIP/本地状态的数据场景不适用此法。
定时开关机与成本:能省多少,哪些不会省
省钱重点在计算费用,以下给你一个常见场景的量化估算(以北弗吉尼亚为例,价格随地区不同,按价目表为准):
- AWS服务器内部价 示例:t3.medium 按需约 $0.0416/小时。全天运行 730 小时/月 ≈ $30.4;只在工作日 9-19 点(约 22 天 × 10 小时 = 220 小时)≈ $9.15。单台纯计算可省约 $21/月,节省近 70%。
- EBS 存储不随停止减少:比如 100GB gp3($0.08/GB-月)≈ $8/月,照收。
- 公网 IPv4 收费(2024 年起,对所有公有 IPv4 均按小时收费):$0.005/小时 ≈ $3.65/月/个,无论实例运行与否都会计费(以 AWS Global 为例,部分区域定价不同)。
- 快照、监控、NAT、负载均衡等其他资源仍按各自计费。
- AWS服务器内部价 注意承诺型计费:如果已购买预留实例或 Savings Plans,停机不会减少承诺费用。要么不买承诺、要么按“工作时段平均负载”去配置承诺额度。
快速结论:
- 只在工作时段用机:小规格实例,单台每月省十几到几十美元是常态;数量多时效果显著。
- 公网 IPv4 和 EBS 是“固定成本”,停机不省这两项。
- 已有承诺(RI/SP)时,要么减少承诺、要么把夜间也跑批,别出现“承诺在烧钱、机器却停着”的局面。
账号、实名认证、支付与风控:不同地区差异与避坑
AWS Global 与 AWS 中国(北京/宁夏)差异
- AWS 全球账号(aws.amazon.com)
- 无国内实名要求;开通即用。
- 支付以信用卡为主,建议企业卡(Visa/Master/Amex)带 3DS 功能。
- 账单按美元或地区币种记,月底扣款。
- AWS 中国区(北京/宁夏)
- 需要企业/个人实名认证,按工信部要求提交证照;用量通常为预付或账期+对公支付。
- 控制台、服务命名略有差异,发布节奏不同,价格单独计。
新账号风控审核常见触发点
- 使用虚拟卡、预付卡,或多次验证失败,容易触发风控冻结。
- 注册/登录频繁变更网络、代理或数据中心出口 IP。
- 刷爆免费套餐、短时间创建异常多的资源。
降低风险的做法:
- 注册与付费使用同一实名信息与同一国家/地区的信用卡;账单地址、电话真实可验证。
- 不要用代理或机场在注册/首单期间切换;保持同一公网出口。
- 首次创建资源量控制在合理范围;开启 Billing Alert 和 AWS Budgets。
支付方式与续费差异
- 全球账号:按需后付、自动扣卡;如需对公,考虑设置企业卡或联系支持开通发票(不同地区政策不同)。
- 中国区:先充值或账期;支持对公转账、增值税发票;需要企业信息与合同。
- 预留实例/Savings Plans:属于承诺合约,分期或一次性;设置定时停机对承诺费用无影响。
使用限制与前置判断:哪些实例不建议“停-开”
- 带本地实例存储(Instance Store)的重要数据:停止会丢失本地盘数据;仅 EBS 上的数据会保留。
- 有固定公网 IP 依赖但未绑定 EIP:关机后公有 IPv4 会变;务必用 EIP/私网域名。
- ASG/EKS/容器编排管理的实例:用 ASG 计划动作或服务层的伸缩策略,不要直接 StopInstances。
- Spot 实例:可停机的 Spot 有条件限制;启动可能因容量/价格不可用而失败。
- 密钥管理:加密卷使用的 KMS Customer Managed Key 被禁用或策略收紧,会导致启动失败。
- 需要“快速恢复”的场景可考虑 Hibernate(休眠),但会占用更多 EBS 存储且有机型/内存限制。
操作细节与易错点(逐条给解决办法)
- 时区错位
- 旧的 CloudWatch Events 使用 UTC;EventBridge Scheduler 支持选择时区。务必选择 Asia/Shanghai 或目标时区。
- Region 不一致
- Scheduler 与目标实例必须同一 Region;多 Region 部署就分别创建。
- 权限不够
- 给 Scheduler/Lambda 的角色添加 ec2:StartInstances、ec2:StopInstances,必要时加 ec2:DescribeInstances;建议限定资源或标签条件最小化授权。
- AWS服务器内部价 ASG 覆盖
- 被 ASG 管理的实例被 Stop 后可能被视为不健康并被替换;ASG 场景请用计划动作。
- KMS 密钥问题
- 加密 EBS 的 CMK 被禁用或删除,实例启动会报错。检查 Key 状态与 grants。
- Spot 启动失败
- 容量/价格不足会导致 start 失败;看 CloudTrail 里的 StartInstances 错误码,或改按需/调整时间窗口。
- 日志与排障
- 给 Scheduler 配置死信队列(SQS)与 CloudWatch Logs;Lambda 打印处理的实例ID;问题复现时对照 CloudTrail。
AWS服务器内部价 场景化案例:按业务类型给出实操经验
案例1:中小团队研发环境(6 台 t3.medium)
- 需求:工作日 9-19 点开机,其余时间关机;周末全停。
- 实现:方案B(标签+Lambda)。标签 Schedule=workday-9-19,两个 Scheduler 计划,Asia/Shanghai 时区。
- 结果:每台计算费从约 $30/月降到 $9/月;6 台每月节约约 $126;EBS 100GB×6 与 IPv4 6 个仍照收约 $69(以示例价估)。
- 踩坑:最初用 UTC 误关机;改为 Scheduler 时区后正常。
案例2:PoC/教学环境(免费套餐 + 少量按需)
- 需求:课堂期间开机,其他时间全停,避免超额计费。
- 实现:方案A(零代码),小规模实例直绑 ID。
- 风控:新账号使用实体信用卡、单一出口网络完成注册,避免虚拟卡触发审核。
- 预算:设置 Budgets,每日阈值 $5、每月阈值 $50,超出发邮件。
AWS服务器内部价 案例3:数据科学 GPU 训练(p3.xlarge,成本高)
- 需求:工作日晚上和周末停机,非训练时间不计费。
- 实现:方案B,按标签分组。考虑到环境初始化耗时,尝试 Hibernate,但发现训练进程与驱动版本存在兼容问题,最终改为容器封装,启动脚本拉取数据后再开始训练。
- 注意:GPU 机型单价高,启动失败(Spot 无容量)会影响计划;若必须准点训练,改按需或加大时间窗口。
和“定时关机”一起要做的两件事(安全与账单)
- 最小权限与变更记录
- 给 Scheduler/Lambda 独立角色;CloudTrail 记录 Start/Stop 调用;限制谁能修改计划任务。
- 账单与告警
- 设置按服务的预算与告警(EC2、EBS、Data Transfer、EIP)。
- AWS服务器内部价 为防误关机/误开机,设置 CloudWatch 指标告警(实例数/CPU/网络),异常时通知。
FAQ:定时开关机相关的常见问题
- Q:关机后哪些还收钱?
- A:EBS、快照、弹性公网 IPv4、负载均衡、NAT、监控、托管服务等仍计费。只减少计算费。
- Q:开机后公网 IP 会变吗?
- A:如果没绑 EIP,自动分配的公有 IPv4 会变化;要保持不变必须用 EIP(注意 EIP 与公有 IPv4 收费政策)。
- Q:可否“优雅关机”?
- A:StopInstances 等同于 ACPI 关机,系统会收尾;如果应用需要更长清理时间,可在实例里安排 cron 定时停服务,再由 Scheduler 晚几分钟 Stop。
- Q:如何串联多服务的启动顺序?
- A:用多个 Scheduler 计划错时,或用 Step Functions 编排(先启动数据库,检测健康后启动应用)。
- AWS服务器内部价 Q:新账号会因为频繁开关机被封吗?
- A:正常的 Start/Stop 不会触发封禁;更常见的风险来自支付/注册异常。保持账单正常、不要用高风险支付工具。
- Q:能按天自动跳过节假日吗?
- A:纯 Cron 做不到“法定节假日”,可以用 Instance Scheduler 方案(自定义日历),或维护一张 DynamoDB 日历由 Lambda 读取。
不同地区和服务发布节奏差异
- 时区支持:EventBridge Scheduler 在大多数全球区支持时区;早期中国区可能发布较晚,使用前在控制台确认。如果不可选时区,按 UTC 写 Cron 并换算本地时间。
- AWS服务器内部价 价格差异:EBS、IPv4、计算单价因区域不同而不同;预算与告警要按实际区域设置。
- 中国区实名认证:企业需要提交营业执照与法定代表人信息;个人提交身份证信息。审核未完成前,部分服务受限。
决策建议(按你的现状选最省心的做法)
- 仅几台实例、清单稳定:方案A,10 分钟上线。
- AWS服务器内部价 十几台以上、需要分组/按标签管理:方案B,后续扩容/变更方便。
- ASG/容器/无状态服务:方案C,用计划动作改容量,不要直接 StopInstances。
- 涉及节假日、复杂日历、多账户统一:考虑官方“Instance Scheduler on AWS”解决方案或自建日历表 + Lambda。
- AWS服务器内部价 已购买 RI/SP:先核对承诺覆盖,不要出现“停机省了按需、承诺却在烧钱”。
最后一公里清单(上线前必查)
- 实例:全部为 EBS-backed,关键数据不在本地盘;需要固定公网地址的实例已绑定 EIP。
- 权限:Scheduler/Lambda 角色最小权限就位;CloudTrail 与日志可追溯。
- 时区与时间:Scheduler 明确设置 Asia/Shanghai 或目标业务时区;周末/节假日策略单独确认。
- 账单:Budgets 与账单告警已配置;IPv4 与 EBS“固定成本”预估在预算内。
- 风控:支付方式合规(实体信用卡/对公),注册网络环境稳定;中国区完成实名与必要合同。
如果你已经清楚自己的场景,直接按对应方案落地即可。过程中遇到“启动失败/计划未生效”的问题,优先从时区、Region、IAM 权限、ASG 覆盖、KMS Key 状态入手排查,基本都能在几分钟内定位。
