如何使用 CloudFormation 在预定义的时间停止和开启我的实例?

上次更新日期:2021 年 8 月 16 日

我希望在预设的时间筛滤非索引字和开启实例,从而降低我的 Amazon Elastic Compute Cloud (Amazon EC2) 使用量。

简短描述

您可以使用 AWS 实例调度器和自动化的 AWS CloudFormation 模板,从而根据计划停止和开启实例。有关更多信息,请参阅自动部署

重要提示:如果您将实例调度器用于使用加密的 Amazon Elastic Block Store (Amazon EBS) 的 EC2 实例,您的实例不会开启。要开启您的实例,您必须向实例调度器授予一个具有对您的 EBS 卷进行加密或解密的密钥策略的密钥用户角色。您必须向 AWS Key Management Service (AWS KMS) 密钥添加密钥策略,以允许该密钥用户角色使用此密钥。

解决方法

在开启之前,您需要设置实例调度器命令行界面 (CLI)

使用实例调度器模板创建一个 CloudFormation 堆栈

该堆栈会部署一个 AWS Lambda 函数、一个 Amazon DynamoDB 表、一个 Amazon CloudWatch Events 事件和若干 Amazon CloudWatch 自定义指标。

1.    打开 AWS 管理控制台

2.    使用实例调度器模板打开 CloudFormation。或者转到步骤 1。启动实例调度器堆栈页面,然后选择 Launch Solution(启动解决方案)。

注意:原定设置下,模板在弗吉尼亚北部区域启动。

3.    在导航栏中,选择您要在其中使用模板启动堆栈的 AWS 区域,然后选择 Next(下一步)。

4.    在堆栈名称中输入 Ec2instanceScheduler

5.    在频率中选择运行计划调度器的频率。例如:5 分钟

注意:频率是指 Amazon CloudWatch Events 再次为实例调度器触发 Lambda 函数之前的分钟数。如果您拥有大量的实例,请尽可能使用最高频率,以避免节流。如果现有频率不足以满足您的需求,您之后可以调整 Frequency(频率)属性。

6.    对于 Enable CloudWatch Logs (启用 CloudWatch Logs),选择

7.    对于 Started tags (已启动标签),请输入 state=started

8.    对于 Stopped tags (已停止标签),请输入 state=stopped

9.    选择 Next

10.    在选项页面中,选择 下一步

11.    检查您的设置,然后选择我确认,AWS CloudFormation 可能创建 IAM 资源

12.    选择 Create(创建)。

创建按计划开启实例的周期

1.    要创建周期,请连接到实例调度器 CLI,然后运行以下命令:

$ scheduler-cli create-period --stack Ec2instanceScheduler --region us-west-2 --name firstdayofmonth --begintime 06:00 --endtime 07:00 --monthdays 1

注意:请将 us-west-2 替换为您自己的区域。要创建周期,您还可以使用 DynamoDB 控制台或自定义资源。有关更多信息,请参阅开启和停止时间

2.    打开 DynamoDB 控制台

3.    选择,然后选择配置表。

注意:实例调度器模板会自动创建两个 DynamoDB 表:状态表和配置表。状态表用于存储模板停止和开启的实例的状态。您可以在配置表中指定所需的周期和计划。

4.    选择项目视图,然后确认 firstdayofmonth 周期显示在表中。

创建周期计划

1.    要创建计划,请连接到 Instance Scheduler CLI,然后运行以下命令:

$ scheduler-cli create-schedule --stack Ec2instanceScheduler --name dayone --region us-west-2 --periods firstdayofmonth --timezone UTC

2.    打开 DynamoDB 控制台

3.    选择,然后选择配置表。

4.    选择项目视图,然后确认 dayone 计划显示在配置表中。

贴标签并测试计划

当您将 CloudFormation 堆栈与实例调度器结合使用时,必须定义实例调度器 tagname 参数。此参数的原定设置值为 Schedule。您可以使用堆栈中的 tagname 参数来查找 Schedule 的值。

注意:实例调度器会监控实例上的标签。如果实例标签上的密钥与定义的调度器标签匹配,则实例调度器将应用为该实例标签值设置的计划。例如,如果标签的密钥设置为 Schedule,值设置为 firstdayofmonth,则 firstdayofmonth 计划将应用到该实例。

在下面的步骤中,您会测试一个在已停止的实例上运行的预定义计划。您可以在配置表中找到预定义的 running 计划。当您对已停止的实例应用 running 计划时,实例调度器将会开启该实例。

注意:停止您正在测试的实例,以便您可以测试预定义的 running 计划。

1.    打开 Amazon EC2 控制台

2.    选择要标记的已停止实例。

3.    选择标签视图,然后选择添加/编辑标签

4.    选择创建标签

5.    对于密钥,输入 State

6.    在 Value 中,输入 running

7.    选择 Save(保存)。

8.    刷新 Amazon EC2 控制台,然后等待 Lambda 函数触发。

注意:如果已触发 Lambda 函数并且运行没有错误,则实例状态会显示为正在运行,具体取决于您所测试的计划。在 CloudWatch 控制台中,您可以检查 Lambda 指标调用情况和错误

9.    打开 DynamoDB 控制台

10.    选择,然后选择状态表。

11.    选择项目视图,然后确认带标签的实例已经开启。

注意:状态数据存储在状态表中。

重要提示:可能会根据您使用的 Lambda 函数的频率和持续时间向您收取额外成本费用。还可能针对您创建的 DynamoDB 表或 CloudWatch Events 规则向您收取额外成本费用。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?