Python 5分钟后在sleep-time.sleep()未按预期工作的情况下停止ec2实例?

Python 5分钟后在sleep-time.sleep()未按预期工作的情况下停止ec2实例?,python,python-3.x,amazon-ec2,aws-lambda,boto3,Python,Python 3.x,Amazon Ec2,Aws Lambda,Boto3,我在lambda中运行了以下代码。我想在5分钟后停止我的EC2实例。为此,我使用time.sleep在发出stop\u instance命令之前有5分钟的间隔。但是代码在time.sleep之后不会传递,而是从一开始就循环lambda脚本 ec2 = boto3.client('ec2', region_name=region) resp = ec2.describe_instance_status(InstanceIds=instances) if(len(resp['InstanceS

我在lambda中运行了以下代码。我想在5分钟后停止我的EC2实例。为此,我使用time.sleep在发出stop\u instance命令之前有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)
ec2=boto3.client('ec2',region\u name=region)
resp=ec2.描述实例状态(实例ID=instances)
如果(len(resp['instancestatus'])==0:
ec2.start_实例(instanceId=instances)
打印(“已启动实例,实例id:,实例”)
其他:
实例_status=resp['InstanceStatus'][0]['InstanceState']['Code']
如果实例_状态==80:
ec2.start_实例(instanceId=instances)
打印(“已启动实例,实例id:,实例”)
打印(“实例状态-1**:”,实例状态)
状态=0
计数器=5
而(状态!=16且计数器>0):
resp=ec2.描述实例状态(实例ID=instances)
如果len(resp['instancestatus'])!=0:
状态=resp['InstanceStatus'][0]['InstanceState']['Code']
时间。睡眠(5)
计数器=计数器-1
打印(“实例状态-3**:”,状态)
打印(“请等5分钟!!!”)
i=0
而(i<1):
时间。睡眠(300)
i=i+1
打印(“等待时间结束,实例状态:”,状态)
resp=ec2.描述实例状态(实例ID=instances)
实例_status=resp['InstanceStatus'][0]['InstanceState']['Code']
打印(“实例状态-2**:”,实例状态)
如果实例_状态==16:
#检查文件是否存在于S3位置,如果存在,则停止实例。
ec2.stop_实例(instanceId=instances)
打印(“实例id为:,实例的已停止实例”)
这是我在cloudwatch日志中看到的,并且实例没有停止。以下是我的cloudwatch日志:


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

既然你只打了一次电话,为什么还要费事呢。只需在

更好的方法是设置UserData EC2脚本,该脚本可以:

A) 将.py文件保存到计算机(关闭S3),并执行该文件以在5分钟内关闭计算机。或

B) UserData中的bash/PowerShell
计时器。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)

当你们只打一次电话的时候,为什么还要费事呢。只需在

更好的方法是设置UserData EC2脚本,该脚本可以:

A) 将.py文件保存到计算机(关闭S3),并执行该文件以在5分钟内关闭计算机。或

B) UserData中的bash/PowerShell
计时器。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)

谢谢Jeremy,起初我尝试不使用while循环,它也有同样的问题。然后我提到了一些SO反应,其中建议有while或if条件。想知道为什么它应该从lamda脚本的开头开始。如果while循环在i=1或大于1时失败,那么它将继续到下一行,即打印“等待时间结束,实例状态…”,这是不会发生的。也许在一段时间后,兰姆达的计时器会被禁止,因为人们试图虐待保持他们的兰姆达温暖。看到这一点,我认为云观察活动现在被称为EventBridge,所以这些说明可能已经过时了,但你明白了:谢谢。我在用户数据中已经有了一个ML python脚本,它在EC2启动时运行。我只想给5分钟的时间,这样python脚本就完全完成了,并将一个文件上传到S3。如果我只是添加STOP实例,那么如果没有睡眠,userdata中的python脚本就不会完全运行,并且我错过了S3中的输出文件。然后我提到了一些SO反应,其中建议有while或if条件。想知道为什么它应该从lamda脚本的开头开始。如果while循环在i=1或大于1时失败,那么它将继续到下一行,即打印“等待时间结束,实例状态…”,这是不会发生的。也许在一段时间后,兰姆达的计时器会被禁止,因为人们试图虐待保持他们的兰姆达温暖。看到这一点,我认为云观察活动现在被称为EventBridge,所以这些说明可能已经过时了,但你明白了:谢谢。我在用户数据中已经有了一个ML python脚本,它在EC2启动时运行。我只想给5分钟的时间,这样python脚本就完全完成了,并将一个文件上传到S3。如果我只是添加STOP实例,那么在没有睡眠的情况下,userdata中的python脚本没有完全运行,并且我错过了S3中的输出文件。Lambda函数的最大执行时间可能不到5分钟。@AKX在编写之日,它从5分钟增加到了15分钟。您的实际目标是什么?也就是说,你想要实现什么?是否希望EC2实例在启动x分钟后停止?如果是这样,最好通过一个简单的shell脚本关闭实例本身。请告诉我们您想要实现什么以及为什么(而不是如何)我们可能会建议一种更好的方法。Lambda函数的最大执行时间可能少于5分钟。@AKX在撰写本文之日,它已从5分钟增加到15分钟。您的实际目标是什么?也就是说,你想要实现什么?是否希望EC2实例在启动x分钟后停止?如果是这样,最好是实例通过