首页 > 解决方案 > 睡眠 5 分钟后停止 ec2 实例 - time.sleep() 没有按预期工作?

问题描述

我在 lambda 中运行以下代码。我想在 5 分钟后停止我的 EC2 实例。为此,我在发出 stop_instance 命令之前使用了 time.sleep 间隔 5 分钟。但是在time.sleep之后代码没有通过,而是从头开始循环lambda脚本?

 ec2 = boto3.client('ec2', region_name=region)
 resp = ec2.describe_instance_status(InstanceIds=instances)
 if(len(resp['InstanceStatuses']) == 0):
          ec2.start_instances(InstanceIds=instances)
          print("Started instance with Instance_id : ",instances)
    else:
        instance_status = resp['InstanceStatuses'][0]['InstanceState']['Code']
        if instance_status == 80:
            ec2.start_instances(InstanceIds=instances)
            print("Started instance with Instance_id : ",instances)
            print("Instance staus - 1 **: ",instance_status)

    status = 0
    counter = 5
    while (status != 16 and counter > 0):
        resp = ec2.describe_instance_status(InstanceIds=instances)
        if len(resp['InstanceStatuses']) != 0:
            status = resp['InstanceStatuses'][0]['InstanceState']['Code']
            time.sleep(5)
            counter=counter-1
            print("Instance staus - 3 **: ",status)

    print("Wait for 5 minutes please !!!")
    i = 0
    while (i < 1):
       time.sleep(300)
       i = i + 1

    print("Wait time is over, instance status : ", status)
    resp = ec2.describe_instance_status(InstanceIds=instances)
    instance_status = resp['InstanceStatuses'][0]['InstanceState']['Code']
    
    print("Instance staus - 2 **: ",instance_status)
    if instance_status == 16:
        #check if file exists in the S3 location, and if yes, then stop instances.
        ec2.stop_instances(InstanceIds=instances)
        print("Stopped instance with Instance_id : ",instances)

这是我在我的 cloudwatch 日志中看到的,并且实例没有停止。以下是我的 cloudwatch 日志:

在此处输入图像描述

有人可以帮我完成这项工作,以便在 x 分钟后停止 ec2。谢谢。

标签: pythonpython-3.xamazon-ec2aws-lambdaboto3

解决方案


当你只调用一次时,为什么还要打扰它。只需删除While

更好的方法是设置一个 UserData EC2 脚本:

A) 将 .py 文件保存到机器(关闭 S3)并执行它以在 5 分钟内关闭机器。或者

B) 用户数据中的 bash/PowerShell timer.sleep(300)

编辑

您可以简单地将其转换为 Bash/PowerShell 并将其放入 UserData 中吗?

time.sleep(300) 
print("Wait time is over, instance status : ", status) 
resp = ec2.describe_instance_status(InstanceIds=instances) 
instance_status = resp['InstanceStatuses'][0]['InstanceState']['Code'] 
print("Instance staus - 2 **: ",instance_status)
 if instance_status == 16:
   ec2.stop_instances(InstanceIds=instances)

推荐阅读