Answers:
更新资料
AWS发布了一个名为“ Instance Scheduler ” 的工具,其中包括从该页面链接的完整配置指南。它看起来像是我在下面描述的EC2 Scheduler的增强,具有更多功能,但是本质上是相同的。
以下指南仍然可以使用,但是最好查看实例调度程序以进行新安装。
原始帖子
AWS有一个称为EC2 Scheduler的工具,可让您非常灵活地控制启动和停止EC2实例。
使用该工具,您可以在设置工具时定义默认的开始时间和停止时间,以后可以进行更改。您可以选择要控制的实例,还可以使用标签为每个实例指定不同的开始和停止时间。
虽然它是一个很棒的工具,但是文档有些含糊和令人困惑。就像文档是由工程师编写的,而不是技术作家一样,该工程师编写了该工具并了解所有相关信息。
注意:如果您有反馈或更正意见,不胜感激。如果您对此有疑问,请开始自己的问题。
什么是EC2 Scheduler
该工具是可与Cloudwatch Events和DynamoDB一起使用的Lambda函数。使用Cloudformation模板进行了部署,该模板还设置了必要的IAM角色和策略。您可以在此处阅读有关体系结构的信息。
部署方式
首先转到此页面,然后单击“启动解决方案”。现在,直接链接在这里,但是可能会改变。
在控制台顶部选择要将资源部署到的区域。该脚本控制任何区域中的EC2实例,但它在一个区域中运行。
标记EC2实例
在此处的文档中对此进行了介绍,但它并非如此简单。
您可以通过标记实例来控制启动和停止的实例。
最简单的情况是,您需要根据计划标记要启动和停止的每个EC2实例。为此,请在控制台中找到您的EC2实例,单击标签,然后创建此标签。
要启用复制和粘贴:
如果要以不同的时间表启动和停止特定实例,则可以将附加信息附加到标记键和值。例如,如果您希望实例从1500 UTC开始并在星期二,星期四和星期五在2400 UTC停止,则输入以下内容。
关键字:scheduler:ec2-startstop:late value:1500; 2400; utc; tue,thu,fri
注意,单词“ late”可以是任何字符串,“ late”没有特殊含义。
您可以使用此工具将UTC转换为当地时间。
您可以使用标签编辑器来批量标签实例。这样可以更轻松地设置批量标记,这对于为开发,测试和生产设置不同的设置可能很有用。我怀疑您是否会在生产中使用它。
CloudFormation参数
运行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"
}
]
}
如果您只想启动和停止实例,这是另一个使用Lambda服务的方法。假定您要控制特定的实例ID。您可以通过添加更多用逗号分隔的ID来控制多个实例。(例如:“ i-3453453”,“ i-45656745”)。您可以在“ AWS控制台实例”部分中找到实例的ID。
下面的代码
{
"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": "*"
}
]
}
下面的代码
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)
下面的代码
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函数
注意:Cron表达式以UTC计算。确保调整您的首选时区的表达式。这是一个每天在格林尼治标准时间/ UTC 08:00运行该函数的示例:
0 08 * * ? *
要在早上重新启动实例,请重复这些步骤并使用您的首选开始时间。如果要在功能失败时发送邮件,则可以设置一个SNS主题,并在“ Lmbda函数创建”窗口中的“调试”下配置该邮件的发送。
所有这些的来源都可以在这里找到:AWS文档