如何基于基于时间的时间表启动和停止AWS EC2实例


17

是否有一种简单的方法可以每天在给定的时间启动和停止AWS EC2实例?这可以为我的开发和测试服务器节省很多钱。

Answers:


16

更新资料

AWS发布了一个名为“ Instance Scheduler ” 的工具,其中包括从该页面链接的完整配置指南。它看起来像是我在下面描述的EC2 Scheduler的增强,具有更多功能,但是本质上是相同的。

以下指南仍然可以使用,但是最好查看实例调度程序以进行新安装。

原始帖子

AWS有一个称为EC2 Scheduler的工具,可让您非常灵活地控制启动和停止EC2实例。

使用该工具,您可以在设置工具时定义默认的开始时间和停止时间,以后可以进行更改。您可以选择要控制的实例,还可以使用标签为每个实例指定不同的开始和停止时间。

虽然它是一个很棒的工具,但是文档有些含糊和令人困惑。就像文档是由工程师编写的,而不是技术作家一样,该工程师编写了该工具并了解所有相关信息。

注意:如果您有反馈或更正意见,不胜感激。如果您对此有疑问,请开始自己的问题。

什么是EC2 Scheduler

该工具是可与Cloudwatch Events和DynamoDB一起使用的Lambda函数。使用Cloudformation模板进行了部署,该模板还设置了必要的IAM角色和策略。您可以在此处阅读有关体系结构的信息

AWS EC2 Scheduler架构

部署方式

首先转到此页面,然后单击“启动解决方案”。现在,直接链接在这里,但是可能会改变。

在控制台顶部选择要将资源部署到的区域。该脚本控制任何区域中的EC2实例,但它在一个区域中运行。

标记EC2实例

此处的文档中对此进行了介绍,但它并非如此简单。

您可以通过标记实例来控制启动和停止的实例。

最简单的情况是,您需要根据计划标记要启动和停止的每个EC2实例。为此,请在控制台中找到您的EC2实例,单击标签,然后创建此标签。

计划程序的EC2实例标记

要启用复制和粘贴:

  • 密钥:Scheduler:ec2-startstop
  • 值:真

如果要以不同的时间表启动和停止特定实例,则可以将附加信息附加到标记键和值。例如,如果您希望实例从1500 UTC开始并在星期二,星期四和星期五在2400 UTC停止,则输入以下内容。

关键字:scheduler:ec2-startstop:late value:1500; 2400; utc; tue,thu,fri

注意,单词“ late”可以是任何字符串,“ late”没有特殊含义。

您可以使用此工具将UTC转换为当地时间。

您可以使用标签编辑器来批量标签实例。这样可以更轻松地设置批量标记,这对于为开发,测试和生产设置不同的设置可能很有用。我怀疑您是否会在生产中使用它。

CloudFormation参数

运行CloudFormation模板时,您必须输入许多参数。大多数情况下您可以保留默认设置。这是一些最重要的参数

  • 堆栈名称:任意命名。这就是CloudFormation中所谓的名称。
  • 自定义标签名称:这是您针对EC2实例放置的标签的“键”。除非有充分理由或需要多次安装,否则将其保留为默认值。
  • 默认启动/停止时间:启动和停止实例的默认UTC时间
  • DynamoDB:设置存储在DynamoDB中。您可以更改表名称等。由于DynamoDB免费套餐不会到期,因此大多数人不太可能需要付费。
  • (第二个屏幕)权限-这是一个红色鲱鱼,请参阅以下部分。将其保留为默认值,并在尝试设置EC2 Scheduler时以管理员身份运行。
  • 通知选项:我发现设置SNS通知很有用,这样我可以验证它是否有效。我没有花时间来研究如何禁用它们,我只是删除了它,然后重新运行了Cloudformation模板来重新安装。

权限,策略和角色

CloudFormation模板的“权限/ IAM角色”部分是一个红色鲱鱼-即,它基本上无关紧要。它仅指定用于运行CloudFormation脚本的角色,对创建的资源或运行lambda函数时使用的角色没有影响。回想起来,这很明显,但是当我开始时对我来说并不明显。

无论您以与IAM相同的角色运行该脚本的角色,都将在IAM中创建内联权限。Lambda函数使用脚本创建的“ ec2调度程序角色”运行。

我在下面列出了我的政策,以防它们对任何人都有帮助。

CloudWatch事件和指标

如果要查看来自Lambda函数的日志,请进入Cloudwatch Events。日志记录非常好。也有指标,因此您可以查看其运行时间,运行时间等。

额外

lambda函数的代码在Github上可用。

政策规定

这些通常不是必需的,但可能是某人使用的,因此我将它们包括在内。

IAM角色政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "iam:CreateRole",
                "iam:GetRole",
                "iam:PassRole",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:DeleteRole",
                "dynamodb:*",
                "lambda:*",
                "SNS:Publish",
                "events:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "S3:GetObject",
            "Resource": [
                "arn:aws:s3:::solutions-us-west-2",
                "arn:aws:s3:::solutions-us-west-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StopInstances",
                "ec2:StartInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-west-2:123456789012:instance/i-0d112345Ab6789012"
            ]
        }
    ]
}

IAM角色的信任策略

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "cloudformation.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

此后,亚马逊改变了一切-“ EC2 Scheduler已被AWS Instance Scheduler取代”
Max Barraclough

感谢Max,我更新了答案以包含链接。它带有完整的实施指南,因此我认为不需要提供完整的说明。
蒂姆(Tim)

1
他们真想让事情复杂化,这真是令人难以置信……
Mehdi

10

如果您只想启动和停止实例,这是另一个使用Lambda服务的方法。假定您要控制特定的实例ID。您可以通过添加更多用逗号分隔的ID来控制多个实例。(例如:“ i-3453453”,“ i-45656745”)。您可以在“ AWS控制台实例”部分中找到实例的ID。

在Lambda控制台中

  1. 打开AWS Lambda控制台,然后选择创建功能。
  2. 从头开始选择作者。
  3. 输入函数的名称,例如“ StopEC2Instances”。
  4. 对于运行时,选择Python 2.7
  5. 展开“角色”下拉菜单,然后选择“创建自定义角色”。这将在浏览器中打开一个新的标签或窗口。
  6. 在“ IAM角色”下拉菜单中,选择“创建新的IAM角色”,然后输入角色名称,例如“ lambda_start_stop_ec2”。
  7. 选择“查看策略文档”,然后单击“编辑”,然后在提示阅读文档时选择“确定”。以此替换策略中的所有文本:

下面的代码

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}
  1. 选择允许以完成角色创建并返回到AWS Lambda控制台。
  2. 要停止实例,请使用以下代码替换功能代码编辑器中的所有文本:

下面的代码

import boto3
region = ' eu-west-1'
instances = ['i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print 'stopped your instances: ' + str(instances)

请记住用您自己的区域和实例值替换。

  1. 从“运行时”下拉菜单中,选择“ Python2.7”。
  2. 在基本设置中,为功能超时输入10秒。
  3. 选择保存。
  4. 重复所有步骤以创建另一个将启动您的实例的功能,但是请使用以下python脚本将其全部启动:

下面的代码

import boto3
region = 'eu-west-1'
instances = [' i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)
    print 'started your instances: ' + str(instances)

安排功能

在这里,您将创建一个CloudWatch Event,它将在晚上触发Lambda函数

  1. 打开Amazon CloudWatch控制台。
  2. 选择事件,然后选择创建规则。
  3. 在事件源下选择计划。
  4. 输入时间间隔或cron表达式,告诉Lambda何时停止实例。有关正确语法的更多信息,请参见规则的计划表达式语法。

注意:Cron表达式以UTC计算。确保调整您的首选时区的表达式。这是一个每天在格林尼治标准时间/ UTC 08:00运行该函数的示例:

0 08 * * ? *
  1. 选择添加目标,然后选择Lambda函数。
  2. 对于“功能”,选择停止实例的Lambda函数。
  3. 选择配置详细信息。
  4. 在提供的字段中输入以下信息:对于“名称”,输入一个有意义的名称,例如“ StopEC2Instances”。对于描述,添加有意义的描述,例如“每天晚上停止EC2实例。”对于状态,选择启用。
  5. 选择创建规则。

要在早上重新启动实例,请重复这些步骤并使用您的首选开始时间。如果要在功能失败时发送邮件,则可以设置一个SNS主题,并在“ Lmbda函数创建”窗口中的“调试”下配置该邮件的发送。

所有这些的来源都可以在这里找到:AWS文档


到底如何才能使Python代码在编辑器中看起来像现在一样?

点击帮助“?” 您会发现有关使用降价格式的更多信息。serverfault.com/editing-help
jscott

1
这是格式代码中的错误。您必须在不同格式之间放置纯文本-在这种情况下,是代码块和带编号的块。这就是为什么我将“下面的代码”放入-在所有地方都没有意义,但是可以工作。
蒂姆(Tim)

@Tim感谢您的澄清。我不知道。它也解决了cron表达式的格式。再次感谢。
netfed
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.