当开发环境中没有活动时,比如说在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控制台中:
转到EC2,选择EC2实例并复制实例ID
转到Cloud Watch并选择Metrics
在AWS命名空间下单击EC2
粘贴实例ID以查找
选择EC2>每实例指标
选择第一个衡量CPU利用率的指标
选择第二个选项卡,称为图形化度量
单击Actions 下的Bell图标
设置一个阈值,这也是困难的部分,保留统计的默认值:平均超过1小时
将Condition Lower/Equal设置为20%(您需要在超过20%CPU的情况下使用机器超过五分之一小时,否则机器将关闭)。
接下来创建一个警报,如果你喜欢,设置一个通知或删除它
一旦创建报警
在Cloud Watch中,选择事件>规则
添加规则
选择EC2作为服务名称和所有事件
单击目标并选择您的Lambda。
当警报熄灭时,Lambda将关闭实例ID
您正在寻找向ec2实例添加停止操作,这可以使用CloudWatch警报轻松实现。您可以使用以下步骤从控制台执行此操作:
-
打开亚马逊EC2控制台
-
在导航窗格中,选择实例。
-
选择实例并选择操作、监视和故障排除,管理CloudWatch警报。
或者,您可以在报警状态列中选择加号()。
-
在管理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}
}