如何通过将实例调度器和 CloudFormation 结合使用来调度 EC2 实例?

上次更新时间:2022 年 4 月 11 日

我想将 AWS 实例调度器和 AWS CloudFormation 结合使用,以用来调度 Amazon Elastic Compute Cloud(Amazon EC2)实例。

简短描述

使用 CloudFormation 模板自动部署 AWS 实例调度器

注意:目前,您无法在亚太地区(雅加达)和亚太地区(大阪)的 AWS 区域使用这些模板。

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

解决方法

安装实例调度器命令行界面(CLI)

要验证是否成功安装,请运行以下命令:

$ scheduler-cli --version

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

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

  1. 打开 AWS 管理控制台
  2. 使用实例调度器模板打开 CloudFormation。或者转到第 1 步。启动实例调度器堆栈页面,然后选择 Launch Solution(启动解决方案)。
    注意:默认在美国东部(弗吉尼亚州北部)区域启用此模板。
  3. 在导航栏中,选择您要在其中使用模板启动堆栈的 AWS 区域,然后选择 Next(下一步)。
  4. Stack name(堆栈名称)中输入您的堆栈命名。
  5. 对于 Instance Scheduler TagName(实例调度器 TagName),您可以将默认值设为 Schedule,也可以进行自定义设置。
  6. 对于 Frequency(频率),请选择运行调度器的频率。例如:5 分钟
    注意:频率是指 EventBridge 再次为实例调度器启动 Lambda 函数之前的分钟数。如果您拥有大量的实例,那么请尽可能使用最高频率,以避免节流。如果现有频率不足以满足您的需求,则您之后可以调整 Frequency(频率)属性。
  7. 对于 Enable CloudWatch Logs(启用 CloudWatch Logs),请选择 Yes(是)。
  8. 对于 Started tags(已启动标签),请输入 state=started
  9. 对于 Stopped tags(已停止标签),请输入 state=stopped
  10. 对于跨账户调度,请提供 Cross-account roles(跨账户角色)参数。为二级账户中每个角色输入 ARN,以逗号分隔。如果您没有使用跨账户调度,请将此参数留空。
  11. 对于所有其他参数,请根据需要自定义堆栈。
  12. 选择 Next(下一步)。
  13. Options(选项)页面中,选择 Next(下一步)。
  14. 检查您的设置,然后选择 I acknowledge that AWS CloudFormation might create IAM resources(我确认,AWS CloudFormation 可能创建 IAM 资源)。
  15. 选择 Create(创建)。

创建期间

要创建周期,您可以使用实例调度器 CLI、DynamoDB 控制台或自定义资源。有关更多信息,请参阅开启和停止时间

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

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

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

使用实例调度器 CLI

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

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

注意:your_stack_name 替换为您在步骤 4 中选择的堆栈名称,并将 eu-west-1 替换为您自己的区域。

使用 DynamoDB 控制台

  1. 打开 DynamoDB 控制台
  2. 选择 Tables(表),然后选择配置表。
    注意:实例调度器模板会自动创建两个 DynamoDB 表:状态表和配置表。状态表用于存储模板停止和启动的实例状态。您可以在配置表中指定所需的周期和计划。
  3. 选择 Explore Table Items(浏览表项目)。
  4. 选择 Create Item(创建项目)。
  5. 选择 JSON 视图,然后使用以下 JSON 模板:
{
  "type": {
    "S": "period"
  },
  "name": {
    "S": "mon-fri-9-5"
  },
  "begintime": {
    "S": "9:00"
  },
  "endtime": {
    "S": "16:59"
  },
  "weekdays": {
    "SS": [
      "mon-fri"
    ]
  }
}

注意:前面的 JSON 模板创建了第一个时间段。在第二个时间段使用类似的 JSON 模板。请务必根据您的要求编辑模板。

创建计划

要创建计划,您可以使用实例调度器 CLI、DynamoDB 控制台或自定义资源

使用实例调度器 CLI

运行以下命令:

$ scheduler-cli create-schedule --stack your_stack_name --name m-f9-5-sat9-12 --region eu-west-1 --periods mon-fri-9-5,sat-9-12 --timezone UTC

使用 DynamoDB 控制台

  1. 打开 DynamoDB 控制台
  2. 选择 Tables(表),然后选择配置表。
  3. 选择 Explore Table Items(浏览表项目)。
  4. 选择 Create Item(创建项目)。
  5. 选择 JSON 视图,然后使用以下 JSON 模板:
{
  "type": {
    "S": "schedule"
  },
  "name": {
    "S": "m-f9-5-sat9-12"
  },
  "timezone": {
    "S": "UTC"
  },
  "periods": {
    "SS": [
      "mon-fri-9-5"
    ]
  }
}

标记实例并测试计划

当您将 CloudFormation 堆栈与实例调度器结合使用时,必须定义 Instance Scheduler TagName(实例调度器 TagName)参数。此参数的默认值为 Schedule

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

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

使用预定义计划

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

  1. 打开 Amazon EC2 控制台
  2. 选择要标记的 Stopped(已停止)实例。
  3. 选择 Tags(标签)视图,然后选择 Manage Tags(管理标签)。
  4. 选择 Add Tag(添加标签)。
  5. Key(键)中,输入 Schedule
  6. Value(值)中,输入 running
  7. 选择 Save(保存)。
  8. 刷新 Amazon EC2 控制台,然后等待启动 Lambda 函数。
    注意:如果已启动 Lambda 函数并且运行没有错误,则 Instance State(实例状态)会显示为 running(正在运行),具体取决于您所测试的计划。在 CloudWatch 控制台中,您可以检查 Lambda 指标调用情况和错误
  9. 打开 DynamoDB 控制台
  10. 选择 Tables(表),然后选择状态表。
  11. 选择 Explore Table Items(浏览表项目),然后确认带标签的实例已经启动。
    注意:状态数据存储在状态表中。
    重要提示:根据您使用 Lambda 函数的频率和持续时间,您可能需要支付额外的成本。还可能针对您创建的 DynamoDB 表或 EventBridge 规则向您收取额外成本费用。

对于跨账户计划:在二级账户中启动远程堆栈

要使用实例调度器在辅助账户中调度实例,请部署 aws-instance-scheduler-remote CloudFormation 模板。此模板创建的角色允许主账户中的实例调度器管理二级账户中的实例。

注意:您必须提供角色的 ARN 作为主账户中实例调度器堆栈的参数。确保使用正确的参数创建或更新实例调度器堆栈。

  1. 打开二级账户的 AWS 管理控制台,然后启动 aws-instance-scheduler-remote CloudFormation 模板。您也可以下载该模板以备将来使用。
    注意:默认在美国东部(弗吉尼亚北部)区域启用此模板。
  2. 在导航栏中,选择您要在其中使用模板启动堆栈的 AWS 区域,然后选择 Next(下一步)。
  3. Select Template(选择模板)页面上,验证是否选择了正确的模板,然后选择 Next(下一步)。
  4. Specify Details(指定详细信息)页面,为远程堆栈指定一个名称。
  5. Parameters(参数)下,查看并修改 Primary account(主账户)参数。输入主账户的账号。
  6. 选择 Next(下一步)。
  7. Options(选项)页面中,选择 Next(下一步)。
  8. 检查您的设置,然后选择 I acknowledge that AWS CloudFormation might create IAM resources(我确认,AWS CloudFormation 可能创建 IAM 资源)。
  9. 选择 Create(创建)。
  10. 选择堆栈 Outputs(输出)选项卡,然后复制 CrossAccountRole 值。
  11. 从主账户中,选择您的 CloudFormation 堆栈,然后选择 Update(更新)。
  12. Update stack(更新堆栈)页面上,选择 Use current template(使用当前模板)。
  13. Cross-account roles(跨账户角色)参数中,粘贴 CrossAccountRole 值。
  14. 选择 Next(下一步),然后选择 I acknowledge that AWS CloudFormation might create IAM resources(我确认,AWS CloudFormation 可能创建 IAM 资源)。
  15. 选择 Update Stack(更新堆栈)。

这篇文章对您有帮助吗?


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