我正在调查一个偶尔出现的错误send_command(),我认为这可能与实例在发送命令之前未完全准备好有关。
send_command()
我正在用这个来等待实例:
instance.wait_until_running()
然而我也看到过:
waiter = ec2.get_waiter('instance_running') waiter.wait(InstanceIds=[instance.id])
和:
waiter = ec2.get_waiter('instance_status_ok') waiter.wait(InstanceIds=[instance.id])
等待实例完全准备好发送命令的区别/正确方法是什么?
在 AWS SDK 中,有多个等待器(waiter)可以用来等待 EC2 实例进入特定状态。不同的等待器有不同的行为和用途。你提到的三种方法主要在等待实例完全准备好以发送命令时有所区别:
waiter
wait_until_running() 是 boto3 的一个方法,它会等待 EC2 实例的状态从 “pending” 变为 “running”。这个方法只检查实例是否已经启动(进入 running 状态),但并不检查其他系统状态,比如实例的健康状况。这个方法比较简单,适用于你只关心实例是否在运行,而不在乎它是否完全健康。
wait_until_running()
boto3
running
ec2.get_waiter('instance_running')
instance_running 是一个等待器(waiter),它会一直等待,直到实例进入 running 状态。get_waiter('instance_running') 返回一个等待器对象,它会循环检查实例的状态,直到实例进入 running 状态为止。
instance_running
get_waiter('instance_running')
ec2.get_waiter('instance_status_ok')
instance_status_ok 是一个更严格的等待器,它不仅等待实例进入 running 状态,还会等待实例通过 AWS 的健康检查。也就是说,它会确保实例的状态不仅是 running,而且没有任何系统级别的问题(例如硬件故障或其他问题)。
instance_status_ok
如果你想确保实例不仅启动而且健康,建议使用:
这种方法会确保实例完全准备好,无论是状态还是健康检查,这对于发送命令或执行其他操作时非常重要。
如果只是希望确认实例是否已经启动,wait_until_running() 或 instance_running 等待器也是合适的选择。