我希望按预定义的时间或利用率阈值来停止和启动实例,从而减少我的 Amazon Elastic Compute Cloud (Amazon EC2) 使用率。我能否配置 AWS Lambda 和 Amazon CloudWatch Events 来帮助我自动实现此目的?

您可以使用 CloudWatch Events 触发 AWS Lambda 函数来按计划的间隔启动和停止您的 EC2 实例。

注意:本文距离介绍了一个简单的解决方案。 如需更稳健的解决方案,请参阅 AWS 实例计划程序

CloudWatch Events 允许您创建在指定时间或间隔触发的事件来响应您的账户中发生的事件。例如,您可以为一天中的特定时间创建 CloudWatch Events,也可以在实例的 CPU 利用率达到特定阈值时创建警报。您还可以配置 Lambda 函数以在被这些 事件触发时启动和停止实例。

在此例中,我们使用 Lambda 函数启动和停止 EC2 实例,然后我们使用在早上启动实例并在晚上停止实例的 CloudWatch Events。

1.    打开 AWS Lambda 控制台,然后选择创建函数
2.    选择从头开始创作
3.    输入函数的名称,例如“StopEC2Instances”。
4.    从运行时下拉菜单中选择 Python2.7
5.    展开 Role 下拉菜单并选择 Create a custom role。这将在浏览器中打开一个新的标签或窗口。
6.    在 IAM 角色下拉菜单中,选择创建新的 IAM 角色,然后输入角色名称,例如“lambda_start_stop_ec2”。
7.    选择查看策略文档编辑,然后在提示阅读文档时选择 Ok(确认)。按以下所示编辑策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}

8.    选择允许以填写角色并返回 AWS Lambda 控制台,然后选择创建函数
9.    如要停止实例,请在 Function code(函数代码)编辑器中输入如下命令:

import boto3
# Enter the region your instances are in. Include only the region without specifying Availability Zone; e.g., 'us-east-1'
region = 'XX-XXXXX-X'
# Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX']
instances = ['X-XXXXXXXX']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print 'stopped your instances: ' + str(instances)

10.  在基本设置中,函数超时设置为 10 秒。
11.  选择保存
12.  重复以上步骤,使用如下命令创建再次启动您的实例的另一个函数:

import boto3
# Enter the region your instances are in. Include only the region without specifying Availability Zone; e.g.; 'us-east-1'
region = 'XX-XXXXX-X'
# Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX']
instances = ['X-XXXXXXXX']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)
    print 'started your instances: ' + str(instances)

注意:可通过名称描述来说明此函数用于启动实例。您可以使用以前创建的角色

测试函数

1.    打开 AWS Lambda 控制台,然后选择函数
2.    选择您的函数,然后选择测试
3.    在事件名称中,键入名称,然后选择创建
4.    选择测试以执行函数。

注意:测试事件的正文不会影响您的函数,因为函数不使用它。

创建在晚上触发 Lambda 函数的 CloudWatch Events

1.    打开 Amazon CloudWatch 控制台
2.    选择事件,然后选择创建规则
3.    选择事件源下的计划
4.    输入时间间隔或告诉 Lambda 何时停止实例的 cron 表达式;有关正确语法的更多信息,请参阅规则的计划表达式语法
注意:Cron 表达式使用 UTC 进行计算。请务必根据您选择的时区调整表达式。
5.    选择 Add target(添加目标),然后选择 Lambda 函数
6.    对于函数,选择停止实例的 Lambda 函数。
7.    选择配置详细信息
8.    在提供的字段中输入以下信息:
       对于名称,键入一个有意义名称,例如“StopEC2Instances”。
       对于描述,添加有意义的描述;例如“每天晚上停止 EC2 实例”。
       对于状态,选择已启用
       选择创建规则

要在早上重启您的实例,请使用您的首选开始时间重复这些步骤。


此页面对您有帮助吗? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS 支持中心

发布时间:2016 年 7 月 7 日

更新时间:2018 年 4 月 25 日