在不活动的情况下以编程方式停止AWS EC2



当开发环境中没有活动时,比如说在2小时不活动后,我们可以停止AWS windows服务器EC2实例吗?我在识别是否有用户虚拟连接到服务器时遇到问题。

我可以通过编程在固定的时间轻松地启动/停止EC2,但为了降低服务器的成本,我试图在EC2不使用时停止它。

我的意图(或用例)是:如果在指定的时间内没有用户使用EC2,它将自动停止。开发人员可以在需要时重新启动它。

最简单的解决方案可能是使用CloudWatch设置警报。

阅读一下文档,它基本上完美地描述了您的用例:

当已达到特定阈值

一个条件可能是平均CPU利用率,例如CPU利用率低于某一点(这很可能与没有登录用户/没有开发人员实际使用机器有关)。

这不是一项简单的任务。

亚马逊EC2服务提供了一台具有RAM、CPU和磁盘的虚拟计算机。它可以查看CPU上的活动量、网络流量和磁盘访问,但无法查看操作系统

因此,问题变成了如何检测"不活动"。这实际上归结为操作系统和做出一些艰难的决定。例如,您的家用电脑屏幕在没有鼠标/键盘输入的指定时间后关闭,但操作系统仍在后台进行活动。如果系统正在运行web服务器等应用程序,并且没有web请求,则很难知道这是因为没有请求而处于"非活动"状态,还是因为web服务器正在运行而处于"活动"状态。

底线:没有现成的功能可以做到这一点。您需要找到自己对"不活动"的定义,然后在操作系统中触发关闭。

如果你想通过时间表来完成,这可能会有所帮助:当EC2实例完成任务时,自动停止它们-DEV社区

更新:不再需要Lambda,请参阅tpschmidt的答案

创建一个Lambda来关闭EC2,例如,当CPU在一个小时内平均低于20%时,EC2将由云监控警报触发。当你编码时,这很好,因为你将使用超过20%,当你休息一个多小时时,你希望它关闭。

一定要在IDE中设置自动保存。

Python Lambda:示例

import boto3
region = 'eu-west-3'
instances = ['i-05be5c0c4039881ed']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
#TODO getInstanceIDFromCloudWatch = event["instanceid"]
ec2.stop_instances(InstanceIds=instances)
print('stopped your instances: ' + str(instances))

参考编号:https://www.howtoforge.com/aws-lambda-function-to-start-and-stop-ec2-instance/

在AWS控制台中:

  1. 转到EC2,选择EC2实例并复制实例ID

  2. 转到Cloud Watch并选择Metrics

  3. 在AWS命名空间下单击EC2

  4. 粘贴实例ID以查找

  5. 选择EC2>每实例指标

  6. 选择第一个衡量CPU利用率的指标

  7. 选择第二个选项卡,称为图形化度量

  8. 单击Actions 下的Bell图标

  9. 设置一个阈值,这也是困难的部分,保留统计的默认值:平均超过1小时

  10. 将Condition Lower/Equal设置为20%(您需要在超过20%CPU的情况下使用机器超过五分之一小时,否则机器将关闭)。

  11. 接下来创建一个警报,如果你喜欢,设置一个通知或删除它

  12. 一旦创建报警

  13. 在Cloud Watch中,选择事件>规则

  14. 添加规则

  15. 选择EC2作为服务名称和所有事件

  16. 单击目标并选择您的Lambda。

  17. 当警报熄灭时,Lambda将关闭实例ID

您正在寻找向ec2实例添加停止操作,这可以使用CloudWatch警报轻松实现。您可以使用以下步骤从控制台执行此操作:

  1. 打开亚马逊EC2控制台

  2. 在导航窗格中,选择实例

  3. 选择实例并选择操作、监视和故障排除,管理CloudWatch警报

    或者,您可以在报警状态列中选择加号()。

  4. 管理CloudWatch警报页面上,执行以下操作:

    • 选择创建警报

    • 在触发报警时接收电子邮件,对于报警通知,选择一个现有的亚马逊SNS主题。你首先需要使用Amazon SNS控制台创建一个Amazon SNS主题。了解更多信息信息,请参阅使用亚马逊SNS进行个人应用程序(A2P)AmazonSimpleNotificationServiceDeveloperGuide中的消息。

    • 打开报警活动n,然后选择停止

    • 对于分组样本和要采样的数据类型,请选择统计信息以及度量。在此示例中,选择平均CPU利用率

    • 对于报警时间百分比,指定度量阈值。在这个例如,指定<和10%。

    • 对于连续期间期间

    • Amazon CloudWatch会自动为您创建一个警报名称。到更改名称,对于报警名称,输入一个新名称。报警名称必须仅包含ASCII字符。

    • 选择创建。

注意您可以根据自己的设置调整报警配置创建报警之前的要求,或者您可以稍后对其进行编辑。这包括度量、阈值、持续时间、操作和通知设置。但是,创建报警后以后无法编辑其名称。

请检查文档中的此链接,以使用相同的方式终止实例。

您可以设置监控活动的AWSCloudwatch警报。不同的参数,如ComparisonOperator、Period和Threshold,可以根据您想要监视Ec2实例的方式进行修改。

然后,您可以设置一个SQS队列,并将Python-Lambda函数设置为其目标。在lambda函数中,可以使用boto3关闭ec2实例。您可以在此处阅读更多详细信息:https://medium.com/geekculture/automatically-turn-off-ec2-instances-upon-inactivity-31fedd363cad

Terraform设置:

https://medium.com/geekculture/terraform-setup-for-automatically-turning-off-ec2-instances-upon-inactivity-d7f414390800

您正在寻找向ec2实例添加停止操作,这可以使用CloudWatch警报轻松实现。

在这里,我将展示如何使用Terraform:来实现这一点

resource "aws_cloudwatch_metric_alarm" "ec2_cpu" {
alarm_name                = "StopTheInstanceAfterInactivity"
metric_name               = "CPUUtilization"
comparison_operator       = "LessThanOrEqualToThreshold"
statistic                 = "Average"
threshold                 = var.threshold
evaluation_periods        = var.evaluation_periods # The number of periods over which data is compared to the specified threshold
period                    = var.period # Evaluation Period (seconds)
namespace                 = "AWS/EC2"
alarm_description         = "This metric monitors ec2 cpu utilization and stop the instance if it is inactive"
actions_enabled           = "true"
alarm_actions             = ["arn:aws:automate:${var.region}:ec2:stop"]
ok_actions                = [] # do nothing
insufficient_data_actions = [] # do nothing
dimensions                = {InstanceId = aws_instance.ec2_instance.id}
}

最新更新