如何将实例调度器和 CloudFormation 配合使用来计划 EC2 实例?

3 分钟阅读
0

我想将 AWS 实例调度器与 AWS CloudFormation 配合使用,以计划 Amazon Elastic Compute Cloud(Amazon EC2)实例。

简短描述

使用 CloudFormation 模板自动部署 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.启动实例调度器中心堆栈页面,然后选择启动解决方案
    **注意:**默认情况下,该模板在美国东部(弗吉尼亚州北部)区域启动。
  3. 在导航栏中,选择要使用模板启动堆栈的 AWS 区域,然后选择下一步
  4. 对于堆栈名称,为堆栈命名。
  5. 对于 Instance Scheduler TagName,可以将默认值保留为 Schedule,也可以对其进行自定义。
  6. 对于频率,选择运行该调度器的频率(以分钟为单位)。例如,您可以选择 5 分钟。
    **注意:**频率是 EventBridge 再次为实例调度器启动 Lambda 函数之前经过的分钟数。如果您拥有大量实例,那么请尽可能使用最高频率,以避免节流。如果频率不足以满足您的需求,则可以稍后调整 Frequency 属性。
  7. 对于启用 CloudWatch 指标,选择
  8. 对于启用 CloudWatch Logs,选择
  9. (可选)对于已启动标签,输入 state=started
  10. (可选)对于已停止****标签,输入 state=stopped
  11. 对于跨账户调度,请提供 Cross-account roles 参数。为辅助账户中的每个角色输入 ARN,用逗号分隔。如果未使用跨账户调度,请将该参数留空。
  12. 对于所有其他参数,请根据需要自定义堆栈。
  13. 选择下一步
  14. 选项页面上,选择下一步
  15. 检查您的设置,然后选择我确认 AWS CloudFormation 可能会创建 IAM 资源
  16. 选择创建

创建时段

要创建时段,您可以使用实例调度器 CLI、DynamoDB 控制台或自定义资源。有关时间段的更多信息,请参阅 Start and stop times

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

  • 周一至周五上午 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. 选择,然后选择配置表。
    **注意:**实例调度器模板会自动创建两个 DynamoDB 表:state 和 configuration。state 表存储模板停止和启动的实例的状态。configuration 表允许您根据自己的要求指定时段和计划。
  3. 选择浏览表项目
  4. 选择创建项目
  5. 选择 JSON 视图,然后使用以下 JavaScript 对象表示法(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. 选择,然后选择配置表。
  3. 选择浏览表项目
  4. 选择创建****项目
  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 参数。此参数的默认值为 Schedule

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

注意:标签区分大小写。如果在运行时段之外手动启动正在运行的实例,则实例调度器不会停止这些实例。如果实例在运行时段手动停止,则除非实施计划,否则实例调度器也不会启动实例。有关更多信息,请参阅 Schedule definitions

使用预定义计划

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

  1. 打开 Amazon EC2 控制台
  2. 选择要标记的已停止实例。
  3. 选择标签视图,然后选择管理标签
  4. 选择添加标签
  5. 对于,输入 Schedule
  6. 对于,输入 running
  7. 选择保存
  8. 刷新 Amazon EC2 控制台,然后等待 Lambda 函数启动。
    **注意:**如果已启动 Lambda 函数并且运行时没有出现错误,实例状态将显示为 running,具体取决于您正在测试的计划。在 CloudWatch 控制台中,您可以检查 Lambda 指标调用情况和错误
  9. 打开 DynamoDB 控制台
  10. 选择,然后选择 state 表。
  11. 选择浏览表项目并确认已启动带标签的实例。状态数据存储在 state 表中。
    **重要信息:**根据您使用的 Lambda 函数的频率和持续时间,您可能需要支付额外费用。您还可能需要为创建的 DynamoDB 表或 EventBridge 规则支付额外费用。

对于跨账户调度: 在辅助账户中启动远程堆栈

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

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

  1. 打开辅助账户的 AWS 管理控制台并启动 aws-instance-scheduler-remote CloudFormation 模板。您也可以下载模板以备将来使用。
    **注意:**默认情况下,该模板在美国东部(弗吉尼亚州北部)区域启动。
  2. 在导航栏中,选择要使用模板启动堆栈的 AWS 区域,然后选择下一步
  3. 选择模板页面上,确认您选择了正确的模板,然后选择下一步
  4. 指定详细信息页面上,为您的远程堆栈指定一个名称。
  5. 参数下,查看并修改 Primary account 参数。输入主账户的账号。
  6. 选择下一步
  7. 选项页面上,选择下一步
  8. 检查您的设置,然后选择我确认 AWS CloudFormation 可能会创建 IAM 资源
  9. 选择创建
  10. 选择堆栈输出选项卡,然后复制 CrossAccountRole 值。
  11. 在主账户中,选择您的 CloudFormation 堆栈,然后选择更新
  12. 更新堆栈页面上,选择使用当前模板
  13. Cross-account roles 参数中,粘贴 CrossAccountRole 值。
  14. 选择下一步,然后选择我确认 AWS CloudFormation 可能会创建 IAM 资源
  15. 选择更新堆栈
AWS 官方
AWS 官方已更新 1 年前