Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

boto3 wait_until_running doesn't work as desired

I'm trying to write a script using boto3 to start an instance and wait until it is started. As per the documentation of wait_until_running, it should wait until the instance is fully started (I"m assuming checks should be OK) but unfortunately it only works for wait_until_stopped and incase of wait_until_running it just starts the instance and doesn't wait until it is completely started. Not sure if I'm doing something wrong here or this is a bug of boto3.

Here is the code:

import boto3


ec2 = boto3.resource('ec2',region_name="ap-southeast-2")
ec2_id = 'i-xxxxxxxx'
instance = ec2.Instance(id=ec2_id)
print("starting instance " + ec2_id)
instance.start()
instance.wait_until_running()
print("instance started")
like image 749
kolaman Avatar asked Oct 17 '25 09:10

kolaman


2 Answers

Thanks to @Mark B @Madhurya Gandi here is the solution that worked in my case:

import boto3,socket
retries = 10
retry_delay=10
retry_count = 0
ec2 = boto3.resource('ec2',region_name="ap-southeast-2")
ec2_id = 'i-xxxxxxxx'
instance = ec2.Instance(id=ec2_id)
print("starting instance " + ec2_id)
instance.start()
instance.wait_until_running()
while retry_count <= retries:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    result = sock.connect_ex((instance.public_ip_address,22))
    if result == 0:
        Print "Instance is UP & accessible on port 22, the IP address is:  ",instance.public_ip_address
        break
    else:
        print "instance is still down retrying . . . "
        time.sleep(retry_delay)
   except ClientError as e:
       print('Error', e)
like image 169
kolaman Avatar answered Oct 19 '25 22:10

kolaman


I believe this way wait until the instance status is 2/2 passed in the check tests:

Boto3 Doc: instance-status.reachability - Filters on instance status where the name is reachability (passed | failed | initializing | insufficient-data ).

    import boto3

    client = boto3.client('ec2')

    waiter = client.get_waiter('instance_status_ok')
    waiter.wait(
        InstanceIds = ["instanceID"],
        Filters = [
            {
                "Name": "instance-status.reachability" ,
                "Values": [
                    "passed"
                ]
            }
        ]
    )


  [1]: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Waiter.InstanceStatusOk
like image 37
diogovalentte Avatar answered Oct 19 '25 23:10

diogovalentte



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!