如何将实例调度器和 CloudFormation 配合使用来计划 EC2 实例?
我想将 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 自定义指标。
- 打开 AWS 管理控制台。
- 使用实例调度器模板打开 CloudFormation。或者,转到步骤 1.启动实例调度器中心堆栈页面,然后选择启动解决方案。
**注意:**默认情况下,该模板在美国东部(弗吉尼亚州北部)区域启动。 - 在导航栏中,选择要使用模板启动堆栈的 AWS 区域,然后选择下一步。
- 对于堆栈名称,为堆栈命名。
- 对于 Instance Scheduler TagName,可以将默认值保留为 Schedule,也可以对其进行自定义。
- 对于频率,选择运行该调度器的频率(以分钟为单位)。例如,您可以选择 5 分钟。
**注意:**频率是 EventBridge 再次为实例调度器启动 Lambda 函数之前经过的分钟数。如果您拥有大量实例,那么请尽可能使用最高频率,以避免节流。如果频率不足以满足您的需求,则可以稍后调整 Frequency 属性。 - 对于启用 CloudWatch 指标,选择是。
- 对于启用 CloudWatch Logs,选择是。
- (可选)对于已启动标签,输入 state=started。
- (可选)对于已停止****标签,输入 state=stopped。
- 对于跨账户调度,请提供 Cross-account roles 参数。为辅助账户中的每个角色输入 ARN,用逗号分隔。如果未使用跨账户调度,请将该参数留空。
- 对于所有其他参数,请根据需要自定义堆栈。
- 选择下一步。
- 在选项页面上,选择下一步。
- 检查您的设置,然后选择我确认 AWS CloudFormation 可能会创建 IAM 资源。
- 选择创建。
创建时段
要创建时段,您可以使用实例调度器 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 控制台
- 打开 DynamoDB 控制台。
- 选择表,然后选择配置表。
**注意:**实例调度器模板会自动创建两个 DynamoDB 表:state 和 configuration。state 表存储模板停止和启动的实例的状态。configuration 表允许您根据自己的要求指定时段和计划。 - 选择浏览表项目。
- 选择创建项目。
- 选择 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 控制台
- 打开 DynamoDB 控制台。
- 选择表,然后选择配置表。
- 选择浏览表项目。
- 选择创建****项目。
- 选择 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 的预定义计划:
- 打开 Amazon EC2 控制台。
- 选择要标记的已停止实例。
- 选择标签视图,然后选择管理标签。
- 选择添加标签。
- 对于键,输入 Schedule。
- 对于值,输入 running。
- 选择保存。
- 刷新 Amazon EC2 控制台,然后等待 Lambda 函数启动。
**注意:**如果已启动 Lambda 函数并且运行时没有出现错误,实例状态将显示为 running,具体取决于您正在测试的计划。在 CloudWatch 控制台中,您可以检查 Lambda 指标调用情况和错误。 - 打开 DynamoDB 控制台。
- 选择表,然后选择 state 表。
- 选择浏览表项目并确认已启动带标签的实例。状态数据存储在 state 表中。
**重要信息:**根据您使用的 Lambda 函数的频率和持续时间,您可能需要支付额外费用。您还可能需要为创建的 DynamoDB 表或 EventBridge 规则支付额外费用。
对于跨账户调度: 在辅助账户中启动远程堆栈
要使用实例调度器在辅助账户中调度实例,请部署 aws-instance-scheduler-remote CloudFormation 模板。此模板创建的角色允许主账户的实例调度器管理辅助账户中的实例。
**注意:**必须提供角色的 ARN 作为主账户中实例调度器堆栈的参数。确保使用正确的参数创建或更新您的实例调度器堆栈。
- 打开辅助账户的 AWS 管理控制台并启动 aws-instance-scheduler-remote CloudFormation 模板。您也可以下载模板以备将来使用。
**注意:**默认情况下,该模板在美国东部(弗吉尼亚州北部)区域启动。 - 在导航栏中,选择要使用模板启动堆栈的 AWS 区域,然后选择下一步。
- 在选择模板页面上,确认您选择了正确的模板,然后选择下一步。
- 在指定详细信息页面上,为您的远程堆栈指定一个名称。
- 在参数下,查看并修改 Primary account 参数。输入主账户的账号。
- 选择下一步。
- 在选项页面上,选择下一步。
- 检查您的设置,然后选择我确认 AWS CloudFormation 可能会创建 IAM 资源。
- 选择创建。
- 选择堆栈输出选项卡,然后复制 CrossAccountRole 值。
- 在主账户中,选择您的 CloudFormation 堆栈,然后选择更新。
- 在更新堆栈页面上,选择使用当前模板。
- 在 Cross-account roles 参数中,粘贴 CrossAccountRole 值。
- 选择下一步,然后选择我确认 AWS CloudFormation 可能会创建 IAM 资源。
- 选择更新堆栈。
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 个月前
- AWS 官方已更新 3 年前