通过 Amazon EC2 实例自动关机降低 IT 成本

Olawale Olaleye
难度
初级
时间
20 分钟
上次更新时间
2025 年 2 月 17 日

介绍

为了保持可发展性和持续履行职责,企业机构不断寻求 IT 成本优化方法,同时保持高质量的服务。一个经常被忽视的潜在成本节约渠道是云资源管理,尤其是对 Amazon Elastic Compute Cloud (Amazon EC2) 实例的管理。许多企业机构发现,他们的 EC2 实例在非高峰时段或闲置期间仍保持运行,这会导致额外成本。

在本文中,我将探讨企业机构客户如何实现 EC2 实例自动关机机制,从而大幅降低云支出。下面,我将介绍以下两种简单且实用的方法:

  1. 使用 Amazon CloudWatch 告警实现非活动状态的实例动态关机。
  2. 使用 AWS LambdaAmazon EventBridge 实现计划关机和指定批量关机。

这些方法不仅能降低成本,还能助力企业机构的可持续性 IT 实践。

前提条件

在开始实验前之前,请确保你已满足以下条件:

  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 告警:

  1. Amazon EC2 控制台中,选择你希望自动关机的实例。
  2. Alarm status(告警状态)列,选择 + 图标,然后创建 CloudWatch 告警,如下面的截图所示。

图 1:在 EC2 控制台中创建 CloudWatch 告警。

步骤 2:创建 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 计划和资源标签自动关闭 EC2 实例,从而实现资源高效利用和成本优化。

图 2:使用 Lambda 与 EventBridge 实现计划关机和指定批量关机。

步骤 1:创建 Lambda 函数

执行以下步骤,创建 Lambda 函数:

  1. AWS Lambda 控制台中,选择 Create function(创建函数)。
  2. 选择 Author from scratch(从头开始创建)。
  3. 为函数命名,例如“auto-stop-instances”。
  4. Runtime(运行时)字段,选择 Python 3.13
  5. 选择 Create function(创建函数)。
  6. 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_keytag_value 变量值替换为你要分配给 EC2 实例的标签信息。

7.部署函数。

步骤 2:修改 Lambda 函数执行角色

执行以下步骤,修改 Lambda 函数的执行角色:

  1. 在 Lambda 函数页面的 Configuration(配置)选项卡上,从导航栏中选择 Permissions(权限)。
  2. 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 计划:

  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:每天 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 计划
  • 通过减少不必要的计算资源使用,加强了可持续发展实践

最佳实践和注意事项

  1. 定期审查 - 定期审查你的自动关机机制设置,确保其符合不断变化的资源使用模式。
  2. 沟通 - 确保所有团队成员都了解自动关机策略,以防止服务意外中断。
  3. 例外情况处理 - 实施关键时期暂时不对实例排执行自动关机的流程。
  4. 监控和日志记录 - 配置全面的日志记录,用于跟踪关机事件和任何潜在问题。
  5. 成本分析 - 定期分析通过自动关机机制节省的成本,向利益相关者展示投资回报 (ROI)。

清理资源

为了避免实验过程中创建的资源持续产生费用,如果不再需要这些资源,请及时删除:

  1. 删除实验中创建的 CloudWatch 告警
  2. 停止或终止所有用于测试的 EC2 实例
  3. 删除实验中创建的 Lambda 函数
  4. 删除实验中创建的 EventBridge 计划
  5. 删除实验中创建的所有 IAM 角色或策略。

通过清理这些资源,可以避免不再使用的服务产生费用。请务必查看你的 AWS 账户,确认所有不必要的资源都已删除。

总结

第一种方法使用 Amazon CloudWatch 告警动态关闭非活动状态的实例。这个方法非常适合于监控重要资源。第二种方法使用 AWS Lambda 和 Amazon EventBridge 实施计划关机和指定批量关机,从而实现对多个实例的高效管理。这些方法有助于优化 EC2 资源使用,在不需要时关闭实例,从而最大限度地减少不必要的开支。

后续步骤

为了进一步优化你的 AWS 环境并有效管理成本,请考虑使用以下资源:

通过使用这些资源,你将能够很好地实施经济高效的解决方案,并优化你的 AWS 基础设施。

更多教程

快速搭建容量高达 35GB 的免费个人网盘

本教程将介绍如何搭建一个没有使用限制的免费私人网盘。

构建企业专属智能客服机器人

本文将演示如何结合多种服务,打造企业专属的智能客服。

使用生成式 AI 构建多语言问答知识库

使用多种服务,构建可汇总搜索结果的多语言知识库。

查看全部教程 >>

免费套餐

AWS 海外区域

拓展海外业务或个人体验
免费使用 100 余种云产品或服务, 长达 12 个月

AWS 中国区域

发展中国业务
免费使用 40 余种核心云服务产品,长达 12 个月