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

如何实现AWS EC2实例夜间自动降配、早间自动升配调度?

AWS EC2 定时升降配+启停实现方案

前置依赖确认

你已经完成的IAM角色配置、CloudWatch+Lambda基础调度能力可直接复用,仅需替换Lambda执行代码、新增两条触发规则即可实现需求。

环境变量配置

Lambda函数中提前添加两个环境变量:

  • EC2_INSTANCE_ID:需要操作的EC2实例ID
  • TARGET_INSTANCE_TYPE:当前触发规则要切换的目标实例规格,夜间触发规则配t2.small,早间触发规则配t2.xlarge

确保Lambda关联的IAM角色已包含以下操作权限:
ec2:StopInstances、ec2:ModifyInstanceAttribute、ec2:StartInstances、ec2:DescribeInstances

Lambda核心代码(Python 3.9+)

import boto3
import os

# 初始化EC2客户端
ec2_client = boto3.client('ec2')
# 从环境变量读取配置
INSTANCE_ID = os.environ.get('EC2_INSTANCE_ID')
TARGET_TYPE = os.environ.get('TARGET_INSTANCE_TYPE')

def lambda_handler(event, context):
    # 查询实例当前状态和规格
    instance_info = ec2_client.describe_instances(InstanceIds=[INSTANCE_ID])['Reservations'][0]['Instances'][0]
    current_state = instance_info['State']['Name']
    current_type = instance_info['InstanceType']

    # 规格符合且正在运行则无需操作
    if current_type == TARGET_TYPE and current_state == 'running':
        print(f"实例{INSTANCE_ID}已符合预期状态,无需执行操作")
        return

    # 实例处于运行状态则先停止
    if current_state == 'running':
        print(f"开始停止实例:{INSTANCE_ID}")
        ec2_client.stop_instances(InstanceIds=[INSTANCE_ID])
        # 等待实例停止完成,每10秒检查一次,最多等待300秒
        stop_waiter = ec2_client.get_waiter('instance_stopped')
        stop_waiter.wait(
            InstanceIds=[INSTANCE_ID],
            WaiterConfig={'Delay': 10, 'MaxAttempts': 30}
        )
        print(f"实例{INSTANCE_ID}已停止")

    # 修改实例规格
    print(f"开始修改实例{INSTANCE_ID}规格为:{TARGET_TYPE}")
    ec2_client.modify_instance_attribute(
        InstanceId=INSTANCE_ID,
        InstanceType={'Value': TARGET_TYPE}
    )
    print(f"实例规格修改完成")

    # 启动实例
    print(f"开始启动实例:{INSTANCE_ID}")
    ec2_client.start_instances(InstanceIds=[INSTANCE_ID])
    # 等待实例启动完成
    start_waiter = ec2_client.get_waiter('instance_running')
    start_waiter.wait(
        InstanceIds=[INSTANCE_ID],
        WaiterConfig={'Delay': 10, 'MaxAttempts': 30}
    )
    print(f"实例{INSTANCE_ID}已启动,当前规格为:{TARGET_TYPE}")

CloudWatch触发规则配置

创建两条独立的定时触发规则即可:

  • 夜间调度规则:设置为你需要的夜间执行时间(例如每日23:00),关联上述Lambda函数,环境变量TARGET_INSTANCE_TYPE设置为t2.small
  • 早间调度规则:设置为你需要的工作日早间执行时间(例如每日7:30),关联上述Lambda函数,环境变量TARGET_INSTANCE_TYPE设置为t2.xlarge

注意选择你所在的对应时区,避免定时时间出现偏差

注意事项

  • 仅EBS存储的EC2实例支持不停数据升降配,若你的实例挂载了实例存储,升降配会导致实例存储的数据丢失,操作前请提前备份
  • 若实例开启了终止保护,需要先关闭终止保护才能修改实例规格
  • 代码默认的等待超时时间为300秒,若你的实例启停耗时较长,可以自行调整WaiterConfig中的MaxAttempts参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:15:04