Simple Python Script to Start and Stop Amazon AWS Instances

Managing AWS instances from a Linux CLI with Python2.7. 


Assuming you already have Python 2.7 installed, you will also need a boto library to be able to work with AWS:

# apt-get update && apt-get install python-boto

For the script to work, you will also need to know the following:

  1. AWS access key and secret key.
  2. The region your instance is running in.
  3. The instance ID.


Script takes a single parameter passed on a CLI, either “start” or “stop”, depending on the action needed:

$ /usr/bin/python start
Starting the instance...
$ /usr/bin/python stop
Stopping the instance...

In case you enter something else:

$ /usr/bin/python sometext
Usage: python {start|stop}

Python Script

The script file is referenced as

# /usr/bin/python2.7
# written by Tomas ( on 05/11/2012
# copyleft free software

import boto.ec2
import sys

# specify AWS keys
auth = {"aws_access_key_id": "<key_id>", "aws_secret_access_key": "<access_key>"}

def main():
    # read arguments from the command line and 
    # check whether at least two elements were entered
    if len(sys.argv) < 2:
	print "Usage: python {start|stop}\n"
	action = sys.argv[1] 

    if action == "start":
    elif action == "stop":
    	print "Usage: python {start|stop}\n"

def startInstance():
    print "Starting the instance..."

    # change "eu-west-1" region if different
        ec2 = boto.ec2.connect_to_region("eu-west-1", **auth)

    except Exception, e1:
        error1 = "Error1: %s" % str(e1)

    # change instance ID appropriately  

    except Exception, e2:
        error2 = "Error2: %s" % str(e2)

def stopInstance():
    print "Stopping the instance..."

        ec2 = boto.ec2.connect_to_region("eu-west-1", **auth)

    except Exception, e1:
        error1 = "Error1: %s" % str(e1)


    except Exception, e2:
        error2 = "Error2: %s" % str(e2)

if __name__ == '__main__':

12 thoughts on “Simple Python Script to Start and Stop Amazon AWS Instances

  1. Thanks for this insight, but I do have a critical question, on which CLI do you run this script from, can I do this from my Local computer, I use Windows and have putty

  2. Thanks a lot. But could you answer me 2 questions below:
    1. I have many ec2 instances (about 10), is there anyway to start/stop a specify instance ? e.g start instance_1
    2. How can I check if an instance is running ? so if I try to start it, console will print something like “instance is already running”.

    • Hi, you can change the script to take a parameter for an instance name, and then start or stop that instance. As for instance state, check “get_all_instance_status” method. It returns class boto.ec2.instancestatus.InstanceStatus object. So you should be able to get system_status and instance_status from it.

    • thanks for that.

      I used your script to start an instance but the console shows me this: Error2: ‘NoneType’ object has no attribute ‘start_instance’. Could your please explain what it is and how to solve it ?

    • “NoneType” means that instead of an instance of whatever class or object you think you’re working with, you’ve actually got “None”.

      If you check the script, you will see that the Error2 comes from the e2 exception (that’s the whole point of it – to be able to track down errors easily). Can you post the line that contains start_instances from your script?

  3. I run into the same problem as Long Tran. In my case, I have already started an instance and am just trying the stopInstance( ) from your program. I have pretty much commented everything else in your program except the relevant lines so that I can stop the instance I know is running.

    Here is the error I am getting:

    topping the instance…
    Error2: ‘NoneType’ object has no attribute ‘stop_instances’

    (I have a feeling that problem lies on my system rather than your code because when I ran another program that will stop the same instance, I got the same error. I am running Python on my MacBook pro. I have been able to successfully do S3 integration though).


  4. I am running into the same problem as Long Tran when I am just using your program to stop an ec2 instance. Instance ID, region have been carefully changed.

    • Let us know if you manage to fix it. This may help others coming across this post and having the same issue.

  5. My problem is resolved now. Problem was at my end as I had thought. Instead of passing us-west-1, I was passing us-west-1a. So the ec2 variable was becoming NoneType
    ec2 = boto.ec2.connect_to_region(“eu-west-1”, **auth)

    Thanks for your putting this script.

    • So you were passing the availability zone rather than the region? I don’t want to sound harsh, but it might be worth reading the manual:

      boto.ec2.connect_to_region(region_name, **kw_params)
    • Yep, that worked ! You’re right. I noticed about it when using awscli at aws configure. My EC2 instance region name in EC2 dashboard is “ap-southeast-1a”, but the .configure file only accept “ap-southeast-1”.

Leave a Reply

Your email address will not be published. Required fields are marked *