



介绍
为了保持可发展性和持续履行职责,企业机构不断寻求 IT 成本优化方法,同时保持高质量的服务。一个经常被忽视的潜在成本节约渠道是云资源管理,尤其是对 Amazon Elastic Compute Cloud (Amazon EC2) 实例的管理。许多企业机构发现,他们的 EC2 实例在非高峰时段或闲置期间仍保持运行,这会导致额外成本。
在本文中,我将探讨企业机构客户如何实现 EC2 实例自动关机机制,从而大幅降低云支出。下面,我将介绍以下两种简单且实用的方法:
- 使用 Amazon CloudWatch 告警实现非活动状态的实例动态关机。
- 使用 AWS Lambda 和 Amazon EventBridge 实现计划关机和指定批量关机。
这些方法不仅能降低成本,还能助力企业机构的可持续性 IT 实践。
前提条件
在开始实验前之前,请确保你已满足以下条件:
- 一个具有所需资源权限的 Amazon Web Services (AWS) 账户
- 基本了解 Amazon EC2、CloudWatch、Lambda、Amazon Identity and Access Management (IAM) 和 EventBridge 等 AWS 服务
- 了解基本的 Python 编程知识
方法 1:使用 CloudWatch 告警动态关闭实例
这种方法非常适合根据实例的活动状态水平自动管理实例。能够对关机条件进行精细控制,这意味着你可以动态地优化资源用途和成本。监控实例的非活动状态时期,并根据 CloudWatch 告警触发针对空闲实例的关机操作,确保在你的整个 AWS 环境中高效地分配资源。
步骤 1:定位 EC2 实例
执行以下步骤,找到你的 EC2 实例并创建 CloudWatch 告警:
- 在 Amazon EC2 控制台中,选择你希望自动关机的实例。
- 在 Alarm status(告警状态)列,选择 + 图标,然后创建 CloudWatch 告警,如下面的截图所示。

图 1:在 EC2 控制台中创建 CloudWatch 告警。
步骤 2:创建 CloudWatch 告警
我们需要创建一个 CloudWatch 告警,用于在实例的 CPU 利用率在 1 小时内保持在 3% 或以下(表示非活动状态)时自动停止该实例。在 Manage CloudWatch alarms(管理 CloudWatch 告警)页面中,完成以下设置项:
- 选择 Create an alarm(创建告警)。
- (可选)启用 Alarm notification(告警通知),并配置接收告警通知的 Amazon Simple Notification Service (Amazon SNS) 主题。
- 启用 Alarm action(告警操作),并选择 Stop(停止)。
- 在 Alarm thresholds(告警阈值)部分,进行以下配置:
- 在 Group samples by(样本分组依据)中,选择 Average(平均值)
- 在 Type of data to sample(采样数据类型)中,选择 CPU Utilization(CPU 利用率)。
- 在 Alarm when(告警触发条件)中,选择 <=
- 在 Percent(百分比)中,选择 3
- 在 Consecutive period(连续周期数)中,选择 1
- 在 Period(周期时间)中,选择 1 Hour(1 小时)
- 为告警命名(例如,AutoShutdownInstance)。
- 描述告警相关的信息。
5. 选择 Create(创建)。
设置 CloudWatch 告警自动关闭实例可能会导致的问题是,意外停止正在执行关键后台任务但 CPU 使用率较低的实例。为了降低这种风险,在启用自动关机机制之前,请仔细审查你实例的工作负载模式。可以考虑使用除 CPU 利用率之外的其他指标(如网络活动或自定义应用程序指标),以便系统进行更全面的实例活动评估。
方法 2:使用 Lambda 和 EventBridge 实现计划关机和指定批量关机
此方法具有更高的可扩展性和灵活性,适用于管理企业机构在 AWS 环境中的多个实例。此方法允许在预定时间按计划关闭实例,也允许根据资源标签对实例进行批处理,从而全面控制 Amazon EC2 资源管理。
架构
下图中的解决方案架构展示了如何使用 AWS 服务来根据预定义的 EventBridge 计划和资源标签自动关闭 EC2 实例,从而实现资源高效利用和成本优化。

图 2:使用 Lambda 与 EventBridge 实现计划关机和指定批量关机。
步骤 1:创建 Lambda 函数
执行以下步骤,创建 Lambda 函数:
- 在 AWS Lambda 控制台中,选择 Create function(创建函数)。
- 选择 Author from scratch(从头开始创建)。
- 为函数命名,例如“auto-stop-instances”。
- 在 Runtime(运行时)字段,选择 Python 3.13。
- 选择 Create function(创建函数)。
- 在 Function(函数)页面的 Code(代码)选项卡上,将默认代码替换为以下内容:
```python
import boto3
def lambda_handler(event, context):
# Initialize the EC2 client
ec2 = boto3.client('ec2')
# Define the tag key and value to identify instances to be stopped
tag_key = 'AutoStop'
tag_value = 'True'
# Get a list of all instances
instances = ec2.describe_instances(Filters=[{'Name': 'tag:'+tag_key, 'Values': [tag_value]}])
# Iterate through reservations and instances
for reservation in instances['Reservations']:
for instance in reservation['Instances']:
instance_id = instance['InstanceId']
# Check the current state of the instance
instance_state = instance['State']['Name']
# If the instance is running, stop it
if instance_state == 'running':
ec2.stop_instances(InstanceIds=[instance_id])
print(f"Stopped EC2 instance {instance_id}")
else:
print(f"EC2 instance {instance_id} is in state {instance_state}, skipping.")
可以将 tag_key 和 tag_value 变量值替换为你要分配给 EC2 实例的标签信息。
7.部署函数。
步骤 2:修改 Lambda 函数执行角色
执行以下步骤,修改 Lambda 函数的执行角色:
- 在 Lambda 函数页面的 Configuration(配置)选项卡上,从导航栏中选择 Permissions(权限)。
- 在 Role name(角色名称)下,点击角色链接,打开 IAM 控制台中的 Lambda 函数执行角色页面。

图 3:打开 Lambda 函数执行角色页面。
3. 在 IAM 角色页面上,选择 Add permissions(添加权限),然后选择 Create inline policy(创建内联策略)。
4. 在 JSON 编辑器中,将默认策略替换为以下策略:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:StopInstances",
"ec2:DescribeInstances"
],
"Resource": "*"
}
]
}
```
Amazon EC2 的 ec2:Describe* API 操作不支持资源级权限,这意味着你无法在控制台中限制用户访问特定资源的权限。这就是需要在 IAM 策略声明的 Resource 元素中使用 * 通配符的原因。
5. 选择 Next(下一步)。
6. 为策略命名,例如 auto-stop-instance-policy。
7. 选择 Create policy(创建策略)。
步骤 3:创建 EventBridge 计划
执行以下步骤,创建 EventBridge 计划:
- 在 Amazon EventBridge 控制台的导航栏中,选择 Schedules(计划),然后选择 Create schedule(创建计划)。
- 在计划详情页面中,为计划命名,例如“auto-stop-instances”。
- 在 Schedule pattern(计划模式)部分,进行以下配置:
- 在 Occurrence(频次)字段,选择 Recurring schedule(重复计划)。
- 在 Time zone(时区)字段,选择运行计划的区域所对应的时区。
- 在 Schedule type(计划类型)字段,选择 Cron-based schedule(基于 Cron 的计划)。
- 在 Cron expression(Cron 表达式)字段,输入计划表达式参数。例如,你可以输入 0 17 * * ? Cron 表达式中的 * 通配符表示每天在 17:00 触发,如以下截图所示。
- 在 Flexible time window(灵活时间窗口)字段,选择 Off(关闭)。
- 选择 Next(下一步)。

图 4:每天 17:00 触发的示例 Cron 表达式。
4. 在 Select target(选择目标)页面上,选择 Templated targets(模板化目标),然后选择 AWS Lambda。
5. 选择你在步骤 1 中创建的 Lambda 函数作为目标。选择 Next(下一步)。
6. 保留 Settings(设置)中的默认设置。选择 Next(下一步)。
7. 检查设置,确认无误后选择 Create schedule(创建计划)。
步骤 4:为你的 EC2 实例添加标签
为每个需要实施自动关闭的 EC2 实例添加一个标签,标签的键值分别为你在步骤 1 中创建 Lambda 函数的 Python 代码中设置的键和值。默认的键值对为:
tag_key = 'AutoStop'
tag_value = 'True'
你可以在 Amazon EC2 实例控制台页面上的 Tags(标签)选项卡,或使用 AWS Resource Groups 控制台中的标签编辑器,为 EC2 实例添加标签。Lambda 函数将在计划的时间自动停止所有带有该资源标签的 EC2 实例。
成功实施案例
我们的企业机构客户在其 AWS 环境中实施了这两种方法:
- 方法 1:使用 Amazon CloudWatch 告警实现非活动状态的实例动态关机。这适用于需要单独监控,并在检测到长时间处于非活动状态后,需立即采取措施的重要实例。
- 方法 2:使用 AWS Lambda 与 Amazon EventBridge 实现计划关机和指定批量关机。这种方法适用于需要更高效地自动关闭多个实例的情况。在教育环境中的一种常见典型情况是,EC2 实例在动手实验室和课程结束后还保持活动状态。这种方法可以系统化地及时关闭资源,避免不必要的成本支出,并优化客户的整个机构 AWS 环境中的资源利用率。
效果显著:
- 在第一个月内将整体 EC2 成本降低了 30%+
- 改善了资源分配,可以将资金投入到其他关键 IT 计划
- 通过减少不必要的计算资源使用,加强了可持续发展实践
最佳实践和注意事项
- 定期审查 - 定期审查你的自动关机机制设置,确保其符合不断变化的资源使用模式。
- 沟通 - 确保所有团队成员都了解自动关机策略,以防止服务意外中断。
- 例外情况处理 - 实施关键时期暂时不对实例排执行自动关机的流程。
- 监控和日志记录 - 配置全面的日志记录,用于跟踪关机事件和任何潜在问题。
- 成本分析 - 定期分析通过自动关机机制节省的成本,向利益相关者展示投资回报 (ROI)。
清理资源
为了避免实验过程中创建的资源持续产生费用,如果不再需要这些资源,请及时删除:
- 删除实验中创建的 CloudWatch 告警。
- 停止或终止所有用于测试的 EC2 实例。
- 删除实验中创建的 Lambda 函数。
- 删除实验中创建的 EventBridge 计划。
- 删除实验中创建的所有 IAM 角色或策略。
通过清理这些资源,可以避免不再使用的服务产生费用。请务必查看你的 AWS 账户,确认所有不必要的资源都已删除。
总结
第一种方法使用 Amazon CloudWatch 告警动态关闭非活动状态的实例。这个方法非常适合于监控重要资源。第二种方法使用 AWS Lambda 和 Amazon EventBridge 实施计划关机和指定批量关机,从而实现对多个实例的高效管理。这些方法有助于优化 EC2 资源使用,在不需要时关闭实例,从而最大限度地减少不必要的开支。
后续步骤
为了进一步优化你的 AWS 环境并有效管理成本,请考虑使用以下资源:
- AWS Well-Architected Framework - 学习了解 Cost Optimization Pillar,其提供了关于在保持业务价值的同时,如何以最低成本运行系统的相关指导。
- 借助 AWS 实现成本优化 - 访问该全面介绍成本优化的网页,了解可优化云支出和提高 AWS 服务效率的策略概要。
- Amazon EC2 成本和容量优化 - 访问此服务页面,了解如何在最大限度提高效率的同时节省计算资源成本。
- AWS 实例调度器 - 对于拥有高级 AWS 技能和资源以维护更全面解决方案的用户,请探索此 AWS 解决方案,其提供了更高灵活性和更多功能,可跨多个 AWS 账户和区域调度 EC2 实例和 Amazon Relational Database Service (Amazon RDS) 实例。
- 使用 Amazon CloudWatch 告警 - 有关如何设置告警和有效监控 AWS 资源的详细说明,请查阅此用户指南。
- AWS Lambda - 阅读 AWS Lambda 开发人员指南,掌握如何创建和管理用于无服务器计算的 Lambda 函数。
- Amazon EventBridge - 阅读 Amazon EventBridge 用户指南,了解如何在你的 AWS 环境中规划自动化任务和创建事件驱动型架构。
通过使用这些资源,你将能够很好地实施经济高效的解决方案,并优化你的 AWS 基础设施。
更多教程
快速搭建容量高达 35GB 的免费个人网盘
本教程将介绍如何搭建一个没有使用限制的免费私人网盘。
构建企业专属智能客服机器人
本文将演示如何结合多种服务,打造企业专属的智能客服。
使用生成式 AI 构建多语言问答知识库
使用多种服务,构建可汇总搜索结果的多语言知识库。
免费套餐
AWS 海外区域
拓展海外业务或个人体验
免费使用 100 余种云产品或服务, 长达 12 个月
AWS 中国区域
发展中国业务
免费使用 40 余种核心云服务产品,长达 12 个月