在亚马逊云服务器Amazon EC2使用过程中,无论是免费还是付费套餐都需要对资源进行使用控制,从而避免资源浪费或导致额外成本。本文将主要分享亚马逊云服务器Amazon EC2实例自动关机机制的实现,从而大幅降低云支出。
亚马逊云科技官网:点击直达
本文将介绍以下两种简单且实用的方法:
- 使用Amazon CloudWatch告警实现非活动状态的实例动态关机;
- 使用AWS Lambda和Amazon EventBridge实现计划关机和指定批量关机。
前提条件
在开始实验前之前,请确保已满足以下条件:
1、一个具有所需资源权限的Amazon Web Services (AWS) 账户。具体注册教程:《亚马逊云科技账号注册流程图解》
2、基本了解Amazon EC2、CloudWatch、Lambda、Amazon Identity and Access Management (IAM)和EventBridge等AWS服务。
3、了解基本的Python编程知识。
方法 1:使用CloudWatch告警动态关闭实例这种方法非常适合根据实例的活动状态水平自动管理实例。能够对关机条件进行精细控制,这意味着你可以动态地优化资源用途和成本。监控实例的非活动状态时期,并根据CloudWatch告警触发针对空闲实例的关机操作,确保在你的整个AWS环境中高效地分配资源。
步骤 1:定位EC2实例执行以下步骤,找到你的EC2实例并创建CloudWatch告警:
- 在Amazon EC2控制台中,选择你希望自动关机的实例;
- 在Alarm status(告警状态)列,选择+图标,然后创建CloudWatch告警,如下面的截图所示。

我们需要创建一个CloudWatch告警,用于在实例的CPU利用率在1小时内保持在3%或以下(表示非活动状态)时自动停止该实例。在 Manage CloudWatch alarms(管理CloudWatch告警)页面中,完成以下设置项:
1、选择Create an alarm(创建告警)。
2、(可选)启用 Alarm notification(告警通知),并配置接收告警通知的 Amazon Simple Notification Service (Amazon SNS) 主题。
3、启用Alarm action(告警操作),并选择Stop(停止)。
4、在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计划和资源标签自动关闭Amazon EC2实例,从而实现资源高效利用和成本优化。

执行以下步骤,创建AWS Lambda函数:
- 在AWS Lambda控制台中,选择Create function(创建函数)。
- 选择Author from scratch(从头开始创建)。
- 为函数命名,例如“auto-stop-instances”。
- 在Runtime(运行时)字段,选择Python 3.13。
- 选择Create function(创建函数)。
- 在Function(函数)页面的Code(代码)选项卡上,将默认代码替换为以下内容:
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实例的标签信息。
步骤 2:修改Lambda函数执行角色执行以下步骤,修改Lambda函数的执行角色:
1、在Lambda函数页面的Configuration(配置)选项卡上,从导航栏中选择Permissions(权限)。
2、在Role name(角色名称)下,点击角色链接,打开IAM控制台中的Lambda函数执行角色页面。

3、在IAM角色页面上,选择Add permissions(添加权限),然后选择Create inline policy(创建内联策略)。
4、在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 计划:
1、在Amazon EventBridge控制台的导航栏中,选择Schedules(计划),然后选择Create schedule(创建计划)。
2、在计划详情页面中,为计划命名,例如“auto-stop-instances”。
3、在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(创建计划)。
步骤 4:为Amazon EC2实例添加标签为每个需要实施自动关闭的Amazon EC2实例添加一个标签,标签的键值分别为你在步骤1中创建Lambda函数的Python代码中设置的键和值。默认的键值对为:
tag_key = ‘AutoStop’
tag_value = ‘True’
可以在Amazon EC2实例控制台页面上的Tags(标签)选项卡,或使用AWS Resource Groups 控制台中的标签编辑器,为EC2实例添加标签。Lambda函数将在计划的时间自动停止所有带有该资源标签的EC2实例。
总结一下,上述第一种方法使用Amazon CloudWatch告警动态关闭非活动状态的实例,非常适合于监控重要资源。第二种方法使用AWS Lambda和Amazon EventBridge实施计划关机和指定批量关机,从而实现对多个实例的高效管理。这些方法有助于优化EC2资源使用,在不需要时关闭实例,从而最大限度地减少不必要的开支。
最佳实践和注意事项:
1、定期审查:定期审查你的自动关机机制设置,确保其符合不断变化的资源使用模式。
2、沟通:确保所有团队成员都了解自动关机策略,以防止服务意外中断。
3、例外情况处理:实施关键时期暂时不对实例排执行自动关机的流程。
4、监控和日志记录:配置全面的日志记录,用于跟踪关机事件和任何潜在问题。
5、成本分析:定期分析通过自动关机机制节省的成本,向利益相关者展示投资回报 (ROI)。
若需对Amazon EC2实例的运行时长进行有效检查,并通过邮件的方式将超出预期使用时间的EC2实例ID发送到预先设定的邮箱,实现提醒用户及时释放资源的方法建议参考:《Amazon EC2实例运行时长监控教程 避免资源浪费》。
(本文由美国主机侦探原创,转载请注明出处“美国主机侦探”和原文地址!)
微信扫码加好友进群
主机优惠码及时掌握
QQ群号:938255063
主机优惠发布与交流




