前言
为了保持可发展性和持续履行职责,企业机构不断寻求 IT 成本优化方法,同时保持高质量的服务。一个经常被忽视的潜在成本节约渠道是云资源管理,尤其是对 Amazon Elastic Compute Cloud (Amazon EC2) 实例的管理。许多企业机构发现,他们的 EC2 实例在非高峰时段或闲置期间仍保持运行,这会导致额外成本。
在本文中,我将探讨企业机构客户如何实现 EC2 实例自动关机机制,从而大幅降低云支出。下面,我将介绍以下两种简单且实用的方法:
- 使用 Amazon CloudWatch 告警实现非活动状态的实例动态关机。
- 使用 AWS Lambda 和 Amazon EventBridge 实现计划关机和指定批量关机。
前提条件
- 难度:初级
- 时间:20 分钟
- 相关产品:Amazon EC2 | Amazon CloudWatch | Amazon EventBridge | Amazon SNS | AWS Lambda
- 上次更新时间:2025 年 2 月 17 日
在开始实验前之前,请确保你已满足以下条件:
- 一个具有所需资源权限的 Amazon Web Services (AWS) 账户
- 基本了解 Amazon EC2、CloudWatch、Lambda、Amazon Identity and Access Management (IAM) 和 EventBridge 等 AWS 服务
- 了解基本的 Python 编程知识
方法 1:使用 CloudWatch 告警动态关闭实例
全部打开这种方法非常适合根据实例的活动状态水平自动管理实例。能够对关机条件进行精细控制,这意味着你可以动态地优化资源用途和成本。监控实例的非活动状态时期,并根据 CloudWatch 告警触发针对空闲实例的关机操作,确保在你的整个 AWS 环境中高效地分配资源。
执行以下步骤,找到你的 EC2 实例并创建 CloudWatch 告警:
-
在 Amazon EC2 控制台中,选择你希望自动关机的实例。
-
在 Alarm status(告警状态)列,选择 + 图标,然后创建 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 实例,从而实现资源高效利用和成本优化。
执行以下步骤,创建 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 实例的标签信息。
执行以下步骤,修改 Lambda 函数的执行角色:
-
在 Lambda 函数页面的 Configuration(配置)选项卡上,从导航栏中选择 Permissions(权限)。
-
在 Role name(角色名称)下,点击角色链接,打开 IAM 控制台中的 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(创建策略)。
执行以下步骤,创建 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. 在 Select target(选择目标)页面上,选择 Templated targets(模板化目标),然后选择 AWS Lambda。
5. 选择你在步骤 1 中创建的 Lambda 函数作为目标。选择 Next(下一步)。
6. 保留 Settings(设置)中的默认设置。选择 Next(下一步)。
7. 检查设置,确认无误后选择 Create schedule(创建计划)。
为每个需要实施自动关闭的 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)。
清理资源
全部打开为了避免实验过程中创建的资源持续产生费用,如果不再需要这些资源,请及时删除:
通过清理这些资源,可以避免不再使用的服务产生费用。请务必查看你的 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 基础设施。