This is a small python script, which makes extensive use of boto, to provide human-readable out similar to ec2-describe-instances (ec2din). fec2din can be run with no arguments or a single argument of an instance ID, instance type, security group, etc. Simply named "f" + "ec2din", the command can easily be run after viewing the horrific ec2din output by simply typing "f!!" in a modern shell. This simple shortcut is why I left the standard ".py" extension off.
This script requires boto to be installed
$ easy_install boto
$ pip install boto
$ ec2din RESERVATION r-57192e11 103757199432 production INSTANCE i-89ba1299 ami-a7f539ce ec2-50-99-41-60.compute-1.amazonaws.com ip-10-99-241-197.ec2.internal running production 0 t1.micro 2011-11-09T07:16:45+0000 us-east-1c aki-805ea7e9 monitoring-disabled 126.96.36.199 10.99.241.197 ebs paravirtual xen sg-c129fe91 default BLOCKDEVICE /dev/sda1 vol-938be057 2011-11-09T07:17:07.000Z BLOCKDEVICE /dev/sdj vol-c47fb1a9 2011-11-09T07:36:06.000Z BLOCKDEVICE /dev/sdk vol-604da915 2011-11-09T17:18:37.000Z $ f!! fec2din = i-f1d4da85 = AMI: ami-37493714 Type: m2.2xlarge (x86_64) Public: 188.8.131.52 (ec2-122-91-39-189.compute-1.amazonaws.com) PrivIP: 10.92.16.121 PubKey: my-pub-key Days: 9 (2012-06-15) AZ: us-east-1b Group: my-security-group, web-server, memcache ROOT ( ephemeral ) /dev/sdl /dev/sdk
fec2din can take an argument to filter your ec2 instance result set. This filter can be:
- Instance ID
- Instance Type
- Public IP
- Private IP
- Tag "Name"
- Security Group
When passing this argument, you don't need to specify which of these you are specifying, it will use pattern matching to figure it out, using several API queries only when necessary
$ fec2din web-servers = web1 (i-84913311) = AMI: ami-7d78cd04 Type: m1.medium (i386) Public: 184.108.40.206 (ec2-173-112-242-16.compute-1.amazonaws.com) PrivIP: 10.50.37.201 PubKey: my-pub-key Days: 98 (2012-09-22) AZ: us-east-1b Group: web-servers Disks: *ROOT (ephemeral) = web2 (i-465e2e21) = AMI: ami-7d78cd04 Type: m1.medium (i386) Public: 220.127.116.11 (ec2-173-202-145-67.compute-1.amazonaws.com) PrivIP: 10.178.15.98 PubKey: my-pub-key Days: 98 (2012-09-22) AZ: us-east-1d Group: web-servers Disks: *ROOT (ephemeral) $ fec2din m2.2xlarge = pgsql-master (i-5fed9c1e) = AMI: ami-7d78cd04 Type: m2.2xlarge (x86_64) Public: 18.104.22.168 (ec2-204-22-99-162.compute-1.amazonaws.com) PrivIP: 10.129.95.27 PubKey: secret Days: 181 (2012-07-01) AZ: us-east-1a Group: db Disks: *ROOT (ephemeral) /dev/sdk (vol-996c10fe) /dev/sdl (vol-61eb0128) /dev/sdm (vol-105c449d) /dev/sdn (vol-62155f02)
Put fec2din in your path, chmod +x. Ensure boto is installed and your access & secret key are exported as environment variables:
export AWS_ACCESS_KEY=JFIOQNAKEIFJJAKDLIJA export AWS_SECRET_KEY=3jfioajkle+OnfAEV5OIvj5nLnRy2jfklZRop3nn
If you are not using the us-east-1 region, you can set alternate endpoints in two ways:
Theoretically, you could set the EC2_URL endpoint to any EC2 compatible endpoint, such as Eucalyptus, using:
but I have not tried it yet.
These variables could also be set at the top of the script if you want to hard-code them, but you'll have to reset them everytime you upgrade. I recommend putting them in your ~/.bashrc or wherever your shell wants them.