A different approach to AWS CLI

For a user of Amazon Web Services, quickly viewing a dashboard of all resources is not straightforward. If using a web browser, the session won’t persist for more than a day and one will have to re-authenticate every day. If using AWS CLI, then he/she might not remember the exact command (was it describe-key-pair or describe-keypair or describe-keypairs?) but even if they do, the output is a not-so-readable JSON. For viewing virtual machines, you might not want to see hundreds of lines of detail. Maybe you just wanted to see the IP of the VM so that you can SSH into it. Or maybe you just wanted to quickly create a virtual machine to test something: do you remember all the parameters you need to specify for instance creation? And don’t forget that you will need to specify the AMI ID of the image, even if you know exactly the operating system name and version.

There is no doubt that AWS CLI is an impressive piece of work. It allows you to do absolutely everything with their cloud. The documentation is thorough. It is great for automation too – output is easily parse-able JSON. However, it’s not as human-friendly. It doesn’t tell you which options are mandatory and which are optional. It doesn’t remind you if you forget to specify keypair while creating an instance. You end up deleting that instance, then Google-searching ‘aws cli delete instance’ and finally creating another instance. The CLI has some inconsistencies too – creating a keypair is create-key-pair but creating a virtual machine is not create-instance but run-instances.

To alleviate these pains, I created a simple CLI tool called “CCH - Cloud CLI for Humans”. Just typing lsvm prints all the virtual machines you have in the cluster. Each command can be run without passing a parameter to it. If an operation requires additional parameters and you didn’t specify it for the first time, it’ll ask you to input those parameters. For example mkvm, the command to create virtual machines:

r@rushi:~$ mkvm
Available flavors: t2.micro, t2.nano, ...
Select flavor ['l' to list]:

Commands for resource creation are short and consistent (mkvm creates virtual machines, mkkp creates keypairs, mksg create security groups). No need to remember AMI IDs (presently it selects Ubuntu 16.04 64-bit image by default, but in future you might specify an OS name and OS version). All the commands supported so far are:

lsvm    - List all virtual machines
mkvm    - Create a virtual machine
stpvm   - Stop a virtual machine
rmvm    - Terminate a virtual machine

lskp    - List all keypairs
mkkp    - Create keypairs
rmkp    - Delete a keypair

lssg    - List all security groups (including a detailed view)
mksg    - Create a security group (including specifying secgroup rules)
rmsg    - Delete a security group

Installation

I have added the tool to PyPI, so download is easy:

pip install cch

Run aws configure if you don’t have AWS credentials configured on your system. Typically, credentials are kept in ~/.aws/credentials file.

Sample usage

For full list of operations supported so far, see this asciinema screencast I’m providing examples here for some of the commands.

See help text of a command

r@rushi:~$ lsvm -h
lsvm [-h] [-s] [<name>]
    -h      Prints helptext and exits
    -s      Prints sizes of VM disks in GB, starting with root disk
    <name>  Only prints VM whose name contains '<name>'

List all virtual machines

r@rushi:~$ lsvm
    ID              Name           Status   Flavor        IP      Vols
i-abcd1234     rushi dev m/c      running  t2.micro 52.12.123.123  1
i-abcd1233   rushi pkg builder    running  t2.micro 52.12.123.122  1
i-abcd1232 rushi vanilla devstack running  t2.large 54.12.123.121  1
i-abcd1231  rushi dbaas devstack  running m4.xlarge 52.12.123.120  1

Also show sizes of volumes of instances:

r@rushi:~$ lsvm  -s
    ID                   Name               Status   Flavor        IP       Vols(GB)
i-abcd1234          rushi dev m/c          running  t2.micro 52.12.123.123    [8]
i-abcd1233        rushi pkg builder        running  t2.micro 52.12.123.122    [8]
i-abcd1232      rushi vanilla devstack     running  t2.large 54.12.123.121    [50]
i-abcd1231       rushi dbaas devstack      running m4.xlarge 52.12.123.120    [50]

List all VMs whose name contains word ‘devstack’

r@rushi:~$ lsvm devstack
    ID              Name           Status   Flavor        IP      Vols
i-abcd1232 rushi vanilla devstack running  t2.large 54.12.123.121  1
i-abcd1231  rushi dbaas devstack  running m4.xlarge 52.12.123.120  1

Create a virtual machine

r@rushi:~$ mkvm
Only Ubuntu image supported as of now
Available flavors: ['t1.micro', 'm1.small', ... ]
Select flavor ['l' to list]: t2.micro
Available key pairs: ['rushi-kp-1', 'prod-keypair', 'test-keypair']
Select keypair: rushi-kp-1
Available security groups: ['Rushi SecGroup', 'openToAll']
Select security group. None to create new one: Rushi SecGroup
Enter root volume size in GBs: 8
r@rushi:~$

Think this makes sense/no sense? Please write a comment below. Create a PR or issue for CCH development. I should totally think of a better name for the CLI tool :)

Thank you :)

w