跳至内容

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

3 分钟阅读
0

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

解决方案

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

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

**注意:**如果您将实例调度器用于使用加密的 Amazon Elastic Block Store (Amazon EBS) 的 Amazon EC2 实例,您的实例无法启动。必须将密钥策略添加到 AWS Key Management Service (AWS KMS) 密钥中,才能允许密钥用户角色使用此密钥。

安装实例调度器

安装实例调度器。然后,要验证安装是否成功,请运行以下命令:

$ scheduler-cli --version

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

要部署 AWS Lambda 函数、Amazon DynamoDB 表、Amazon EventBridge 规则和 Amazon CloudWatch 自定义指标,请完成以下步骤:

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

创建时段

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

使用实例调度器 CLI

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

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

**注意:**将 your_stack_name 替换为您在步骤 2 中选择的堆栈名称,将 aa-example-1 替换为您自己的区域。

使用 DynamoDB 控制台

要创建时段,请完成以下步骤:

  1. 打开 DynamoDB 控制台
  2. 选择 Tables(表),然后选择配置表。
    **注意:**实例调度器模板会自动创建 state 和 configuration DynamoDB 表。state 表存储模板停止和启动的实例的状态。configuration 表允许您根据自己的要求指定时段和计划。
  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 模板创建第二个时段。将 mon-fri-9-5 替换为您的时段名称,将 9:00 替换为您的开始时间,将 16:59 替换为您的结束时间。

创建计划

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

使用实例调度器 CLI

要创建计划,请运行以下 create-schedule CLI 命令:

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

**注意:**将 your_stack_name 替换为您的堆栈名称,将 aa-example-1 替换为您的区域,将 mon-fri-9-5,sat-9-12 替换为您的计划。

使用 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 参数。此参数的默认值为 Schedule

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

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

使用预定义计划

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

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

跨账户计划

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

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

要在辅助账户中启动远程堆栈,请完成以下步骤:

  1. 打开辅助账户的 AWS 管理控制台并启动 aws-instance-scheduler-remote CloudFormation 模板。您也可以下载模板以备将来使用。

    **注意:**默认情况下,该模板在美国东部(弗吉尼亚州北部)区域启动。

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

  3. Select Template(选择模板)页面上,确认您是否已选择正确的模板,然后选择 Next(下一步)。

  4. 指定详细信息页面上,为您的远程堆栈指定一个名称。

  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(更新堆栈)。