Tim Asked: 2017-08-09 18:54:17 +0800 CST2017-08-09 18:54:17 +0800 CST 2017-08-09 18:54:17 +0800 CST 如何根据基于时间的计划启动和停止 AWS EC2 实例 772 是否有一种简单的方法可以在每天的给定时间启动和停止 AWS EC2 实例?这可以为我的开发和测试服务器节省很多钱。 amazon-ec2 3 个回答 Voted Best Answer Tim 2017-08-09T18:54:17+08:002017-08-09T18:54:17+08:00 更新 AWS 发布了一个名为“ Instance Scheduler ”的工具,包括从该页面链接的完整配置指南。它看起来是我在下面描述的 EC2 调度程序的增强,具有更多功能,但本质上是相同的。 下面的指南仍然有效,但最好查看实例调度程序以进行新安装。 原帖 AWS 有一个名为EC2 Scheduler的工具,可让您非常灵活地控制 EC2 实例的启动和停止。 该工具允许您在设置工具时定义默认开始和停止时间,您可以稍后更改。您可以选择控制哪些实例,您可以使用标签为每个实例指定不同的开始和停止时间。 虽然它是一个很棒的工具,但文档有些模糊和混乱。这就像文档是由编写工具并了解它的一切的工程师编写的,而不是由技术编写者编写的。 注意:如果您有反馈或更正意见,我们将不胜感激。如果您有基于此的问题,请开始您自己的问题。 什么是 EC2 调度程序 此工具是一个 Lambda 函数,可与 Cloudwatch Events 和 DynamoDB 一起使用。它使用 Cloudformation 模板进行部署,该模板还设置了必要的 IAM 角色和策略。您可以在此处阅读有关架构的信息。 部署 首先转到此页面并单击“启动解决方案”。现在直接链接在这里,但它可能会改变。 在控制台顶部选择要将资源部署到的区域。该脚本控制任何区域中的 EC2 实例,但它在一个区域中运行。 标记 EC2 实例 这在此处的文档中有所介绍,但并不像它可能的那么简单。 您可以通过标记实例来控制启动和停止哪些实例。 最简单的情况要求您根据计划标记要启动和停止的每个 EC2 实例。为此,请在控制台中找到您的 EC2 实例,单击标签,然后创建此标签 要启用复制和粘贴: 键:调度程序:ec2-startstop 值:真 如果您想让特定实例按不同的计划启动和停止,您可以将附加信息附加到标签键和值。例如,如果您希望实例在周二、周四和周五的 1500 UTC 开始并在 2400 UTC 停止,则输入以下内容。 键:调度程序:ec2-startstop:late 值:1500;2400;utc;tue,thu,fri 请注意,单词“late”可以是任何字符串,“late”没有特殊含义。 您可以使用此工具将 UTC 转换为您的本地时间。 您可以使用标记编辑器批量标记实例。这可以让您更轻松地设置批量标记,这对于为开发、测试和生产设置不同的设置非常有用。我怀疑你会在生产中使用它。 CloudFormation 参数 当您运行 CloudFormation 模板时,您必须输入很多参数。大多数你可以默认离开。这是一些最重要的参数 堆栈名称:随意命名。这就是它在 CloudFormation 中的名称。 自定义标签名称:这是您针对 EC2 实例放置的标签的“键”。除非您有充分的理由或需要多次安装,否则请将其保留为默认值。 默认启动/停止时间:启动和停止实例的默认 UTC 时间 DynamoDB:设置存储在 DynamoDB 中。您可以更改表名等。由于 DynamoDB 免费套餐不会过期,因此大多数人不太可能被收费。 (第二个屏幕)权限 - 这是一个红鲱鱼,请参阅下面的部分。将其保留为默认值,并在您尝试设置 EC2 调度程序时以管理员身份运行。 通知选项:我发现设置 SNS 通知很有用,因此我可以验证它是否正常工作。我没有花时间研究如何禁用它们,我只是删除了它重新运行 Cloudformation 模板重新安装。 权限、策略和角色 CloudFormation 模板的 Permissions / IAM 角色部分是一个红鲱鱼 - 即它在很大程度上无关紧要。它仅指定用于运行 CloudFormation 脚本的角色,它对创建的资源或 lambda 函数运行时使用的角色没有影响。回想起来,这很明显,但当我开始时,这对我来说并不明显。 无论您以何种角色运行此脚本,都将在 IAM 中创建相同的角色和内联权限。Lambda 函数使用脚本创建的“ec2 调度程序角色”运行。 我在下面列出了我的政策,以防它们对任何人都有帮助。 CloudWatch 事件和指标 如果您想查看 Lambda 函数的日志,请进入 Cloudwatch Events。日志记录非常好。还有一些指标,因此您可以查看它何时运行、运行时间等。 额外的 Github上提供了 lambda 函数的代码。 政策 这些通常不是必需的,但可能适合某人,所以我将它们包括在内。 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" } ] } netfed 2018-01-13T18:49:12+08:002018-01-13T18:49:12+08:00 如果您只是想启动和停止实例,这里有另一种方法,它也使用了 Lambda 服务。它假定您要控制特定的实例 ID。您可以通过添加更多用逗号分隔的 id 来控制多个实例。(例如:'i-3453453'、'i-45656745')。您可以在 AWS 控制台实例部分中找到您的实例的 ID。 在 Lambda 控制台中 打开 AWS Lambda 控制台,然后选择创建函数。 从头开始选择作者。 输入函数的名称,例如“StopEC2Instances”。 对于运行时,选择 Python 2.7 展开角色下拉菜单,然后选择创建自定义角色。这会在您的浏览器中打开一个新选项卡或窗口。 在 IAM 角色下拉菜单中,选择创建新的 IAM 角色,然后输入角色名称,例如“lambda_start_stop_ec2”。 选择查看策略文档、编辑,然后在提示阅读文档时选择确定。将策略中的所有文本替换为: 下面的代码 { "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": "*" } ] } 选择允许以完成创建角色并返回 AWS Lambda 控制台。 要停止您的实例,请将函数代码编辑器中的所有文本替换为以下内容: 下面的代码 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) 请记住用您自己的替换区域和实例值。 从运行时下拉菜单中,选择 Python2.7。 在基本设置中,为功能超时输入 10 秒。 选择保存。 重复所有步骤以创建另一个将启动您的实例的函数,然后使用此 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 事件,该事件将在晚上触发您的 Lambda 函数 打开 Amazon CloudWatch 控制台。 选择事件,然后选择创建规则。 选择事件源下的计划。 输入时间间隔或 cron 表达式,告诉 Lambda 何时停止您的实例。有关正确语法的更多信息,请参阅规则的计划表达式语法。 注意:Cron 表达式以 UTC 进行计算。请务必根据您的首选时区调整表达式。这是一个示例,它将在每天 08:00 GMT/UTC 运行该函数): 0 08 * * ? * 选择添加目标,然后选择 Lambda 函数。 对于函数,选择停止您的实例的 Lambda 函数。 选择配置详细信息。 在提供的字段中输入以下信息: 对于名称,输入有意义的名称,例如“StopEC2Instances”。对于描述,添加有意义的描述,例如“每天晚上停止 EC2 实例”。对于状态,选择启用。 选择创建规则。 要在早上重新启动您的实例,请重复这些步骤并使用您的首选开始时间。如果您想在函数失败时发送邮件消息,您可以在 Lmbda 函数创建窗口的调试下设置 SNS 主题并配置该消息的发送。 所有这些的来源都可以在这里找到:AWS 文档 Shivam Nagar 2022-06-14T23:05:29+08:002022-06-14T23:05:29+08:00 实现相同目标的更简单方法是使用 AWS EventBridge 规则。 转到 Amazon EventBridge > 规则 创建一个新规则并选择Rule type作为Schedule。 为实例关闭计划提供 cron 表达式。例如。cron(30 17 * * ? *) 对于Target1,选择: 目标类型为“AWS 服务” 定位为“AWS StopInstances API call”,并且 提供要按计划关闭的实例 ID 。 最后,选择为此特定资源创建新角色 查看计划和实例详细信息并完成创建规则。 您可以使用上面提到的方法(使用 lambda)再次启动同一个实例。
更新
AWS 发布了一个名为“ Instance Scheduler ”的工具,包括从该页面链接的完整配置指南。它看起来是我在下面描述的 EC2 调度程序的增强,具有更多功能,但本质上是相同的。
下面的指南仍然有效,但最好查看实例调度程序以进行新安装。
原帖
AWS 有一个名为EC2 Scheduler的工具,可让您非常灵活地控制 EC2 实例的启动和停止。
该工具允许您在设置工具时定义默认开始和停止时间,您可以稍后更改。您可以选择控制哪些实例,您可以使用标签为每个实例指定不同的开始和停止时间。
虽然它是一个很棒的工具,但文档有些模糊和混乱。这就像文档是由编写工具并了解它的一切的工程师编写的,而不是由技术编写者编写的。
注意:如果您有反馈或更正意见,我们将不胜感激。如果您有基于此的问题,请开始您自己的问题。
什么是 EC2 调度程序
此工具是一个 Lambda 函数,可与 Cloudwatch Events 和 DynamoDB 一起使用。它使用 Cloudformation 模板进行部署,该模板还设置了必要的 IAM 角色和策略。您可以在此处阅读有关架构的信息。
部署
首先转到此页面并单击“启动解决方案”。现在直接链接在这里,但它可能会改变。
在控制台顶部选择要将资源部署到的区域。该脚本控制任何区域中的 EC2 实例,但它在一个区域中运行。
标记 EC2 实例
这在此处的文档中有所介绍,但并不像它可能的那么简单。
您可以通过标记实例来控制启动和停止哪些实例。
最简单的情况要求您根据计划标记要启动和停止的每个 EC2 实例。为此,请在控制台中找到您的 EC2 实例,单击标签,然后创建此标签
要启用复制和粘贴:
如果您想让特定实例按不同的计划启动和停止,您可以将附加信息附加到标签键和值。例如,如果您希望实例在周二、周四和周五的 1500 UTC 开始并在 2400 UTC 停止,则输入以下内容。
键:调度程序:ec2-startstop:late 值:1500;2400;utc;tue,thu,fri
请注意,单词“late”可以是任何字符串,“late”没有特殊含义。
您可以使用此工具将 UTC 转换为您的本地时间。
您可以使用标记编辑器批量标记实例。这可以让您更轻松地设置批量标记,这对于为开发、测试和生产设置不同的设置非常有用。我怀疑你会在生产中使用它。
CloudFormation 参数
当您运行 CloudFormation 模板时,您必须输入很多参数。大多数你可以默认离开。这是一些最重要的参数
权限、策略和角色
CloudFormation 模板的 Permissions / IAM 角色部分是一个红鲱鱼 - 即它在很大程度上无关紧要。它仅指定用于运行 CloudFormation 脚本的角色,它对创建的资源或 lambda 函数运行时使用的角色没有影响。回想起来,这很明显,但当我开始时,这对我来说并不明显。
无论您以何种角色运行此脚本,都将在 IAM 中创建相同的角色和内联权限。Lambda 函数使用脚本创建的“ec2 调度程序角色”运行。
我在下面列出了我的政策,以防它们对任何人都有帮助。
CloudWatch 事件和指标
如果您想查看 Lambda 函数的日志,请进入 Cloudwatch Events。日志记录非常好。还有一些指标,因此您可以查看它何时运行、运行时间等。
额外的
Github上提供了 lambda 函数的代码。
政策
这些通常不是必需的,但可能适合某人,所以我将它们包括在内。
IAM 角色政策
IAM 角色的信任策略
如果您只是想启动和停止实例,这里有另一种方法,它也使用了 Lambda 服务。它假定您要控制特定的实例 ID。您可以通过添加更多用逗号分隔的 id 来控制多个实例。(例如:'i-3453453'、'i-45656745')。您可以在 AWS 控制台实例部分中找到您的实例的 ID。
在 Lambda 控制台中
下面的代码
下面的代码
请记住用您自己的替换区域和实例值。
下面的代码
安排功能
在这里,您将创建一个 CloudWatch 事件,该事件将在晚上触发您的 Lambda 函数
注意:Cron 表达式以 UTC 进行计算。请务必根据您的首选时区调整表达式。这是一个示例,它将在每天 08:00 GMT/UTC 运行该函数):
要在早上重新启动您的实例,请重复这些步骤并使用您的首选开始时间。如果您想在函数失败时发送邮件消息,您可以在 Lmbda 函数创建窗口的调试下设置 SNS 主题并配置该消息的发送。
所有这些的来源都可以在这里找到:AWS 文档
实现相同目标的更简单方法是使用 AWS EventBridge 规则。
转到 Amazon EventBridge > 规则
创建一个新规则并选择Rule type作为Schedule。
为实例关闭计划提供 cron 表达式。例如。cron(30 17 * * ? *)
对于Target1,选择:
查看计划和实例详细信息并完成创建规则。
您可以使用上面提到的方法(使用 lambda)再次启动同一个实例。