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

上次更新日期:2021 年 9 月 23 日

我希望在预设的时间筛滤非索引字和开启实例,从而降低我的 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 EventBridge 规则和若干 Amazon CloudWatch 自定义指标。

1.    打开 AWS 管理控制台

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

注意:此模板默认在美国东部 (弗吉尼亚北部) 地区启用。

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

4.    在堆栈名称中输入 Ec2instanceScheduler

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

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

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

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

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

9.    选择 Next

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

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

12.    选择创建

创建期间

以下示例向您展示如何创建符合下述条件的实例:

  • 周一至周五上午 9 点开始,下午 5 点停止
  • 从星期六上午 9 点开始,然后在下午 12 点停止

在此示例中,您必须创建两个期间。对于您自己的场景,创建适当数量的期间。

1.    连接到实例调度器 CLI,然后运行以下命令:

$ scheduler-cli create-period --stack Ec2instanceScheduler --region us-west-2 --name mon-fri-9-5 --begintime 9:00 --endtime 16:59 --weekdays mon-fri
$ scheduler-cli create-period --stack Ec2instanceScheduler --region us-west-2 --name sat-9-12 --begintime 9:00 --endtime 11:59 --weekdays sat

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

2.    打开 DynamoDB 控制台

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

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

4.    选择项目视图,然后确认 mon-Fri-9-5sat-9-12 期间显示在配置表中。

创建计划

1.    要创建组合两个期间的计划,请连接到实例调度器 CLI,然后运行以下命令:

$ scheduler-cli create-schedule --stack Ec2instanceScheduler --name m-f9-5-sat9-12 --region us-west-2 --periods mon-fri-9-5,sat-9-12 --timezone America/New_York

2.    打开 DynamoDB 控制台

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

4.    选择项目视图,然后确认 m-f9-5-sat9-12 计划显示在配置表中。

贴标签并测试计划

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

实例调度器会监控实例上的标签。如果实例标签上的密钥与定义的调度器标签匹配,则实例调度器将应用为该实例标签值设置的计划。例如,标签的键设置为 Schedule,值设置为 m-f9-5-sat9-12。在此示例中,实例在周一至周五的上午 9 点开始,下午 5 点停止。实例也从星期六的上午 9 点开始,下午 12 点停止。

注意:标签键和值要区分大小写。如果在运行期间之外手动启动正在运行的实例,实例调度器不会停止该实例。如果实例在运行期间手动停止,则除非实施计划,否则实例调度器也不会启动实例。有关详细信息,请参阅计划定义

使用预定义计划

除了自定义计划之外,您还可以使用配置表中的任何预定义计划。例如,以下是测试名为 running 的预定义计划的方式:

1.    打开 Amazon EC2 控制台

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

3.    选择标签视图,然后选择管理标签

4.    选择添加标签

5.    在 Key 中,输入 Schedule

6.    在 Value 中,输入 running

7.    选择 Save(保存)。

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

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

9.    打开 DynamoDB 控制台

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

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

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

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


这篇文章对您有帮助吗?


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