It occurred to me recently that while I have written articles on Boto for AWS (the Python SDK) I have yet to write articles on how to use the AWS CLI, Terraform and the Go SDK. All of that will come in due time, for starters this article is going to be about the AWS CLI.
To start you will need to install the AWS CLI following these links:
https://aws.amazon.com/cli/
https://github.com/aws/aws-cli
Note you will need to make sure you have an account with an access key and have setup the required credentials under ~/.aws/ for the CLI to work. How to do this is covered near the end of the second link above to the git repo.
After that is done you are ready to rock and roll. To test it out you can run…
aws ec2 describe-instances
Assuming your default region, and profile settings are correct it should output JSON.
Launching an EC2 instance
To launch an EC2 instance from the command line use the command below replacing the variables preceded with $ with their real values.
aws --profile $account --region $region ec2 run-instances --image-id $image_id --count $count --instance-type $instance_type --key-name $ssh_key_name --subnet-id $subnet_id
(Assuming you have setup the required dependencies like uploading your SSH key to AWS and specifying its name in the command above this should launch your VM).
It should be noted there is a lot more you can to to tweak your instance, such as changing the EBS volume size for your root disk that is launched or tagging. You will see examples of this in my shell script. The purpose of this article is to share a shell script I have written and use whenever I want to quickly launch a test VM (which is common). For more permanent things I use an infrastructure as code approach via Terraform. But the need for launching quick test VM’s never goes away, thus this shell script was born. You will notice my script auto-tags our VM’s…I do this because in our environment if you VM isn’t tagged appropriately it is deleted + it’s courtesy in an AWS environment to tag your resources, otherwise no one will ever what tree to bark up when there is a problem such as ‘are you still using this cause it looks idle?’ 🙂
My Shell Script for Launching EC2 VM’s
#!/bin/bash # Global Settings account="my-account" region="us-east-1" # Instance settings image_id="ami-03ebd214" # ubuntu 14.04 ssh_key_name="my_ssh_key-rsa-2048" instance_type="m4.xlarge" subnet_id="subnet-b8214792" root_vol_size=20 count=1 # Tags tags_Name="my-test-instance" tags_Owner="tuxninja" tags_ApplicationRole="Testing" tags_Cluster="Test Cluster" tags_Environment="dev" tags_OwnerEmail="tuxninja@tuxlabs.com" tags_Project="Test" tags_BusinessUnit="Cloud Platform Engineering" tags_SupportEmail="tuxninja@tuxlabs.com" echo 'creating instance...' id=$(aws --profile $account --region $region ec2 run-instances --image-id $image_id --count $count --instance-type $instance_type --key-name $ssh_key_name --subnet-id $subnet_id --block-device-mapping "[ { \"DeviceName\": \"/dev/sda1\", \"Ebs\": { \"VolumeSize\": $root_vol_size } } ]" --query 'Instances[*].InstanceId' --output text) echo "$id created" # tag it echo "tagging $id..." aws --profile $account --region $region ec2 create-tags --resources $id --tags Key=Name,Value="$tags_Name" Key=Owner,Value="$tags_Owner" Key=ApplicationRole,Value="$tags_ApplicationRole" Key=Cluster,Value="$tags_Cluster" Key=Environment,Value="$tags_Environment" Key=OwnerEmail,Value="$tags_OwnerEmail" Key=Project,Value="$tags_Project" Key=BusinessUnit,Value="$tags_BusinessUnit" Key=SupportEmail,Value="$tags_SupportEmail" Key=OwnerGroups,Value="$tags_OwnerGroups" echo "storing instance details..." # store the data aws --profile $account --region $region ec2 describe-instances --instance-ids $id > instance-details.json echo "create termination script" echo "#!/bin/bash" > terminate-instance.sh echo "aws --profile $account --region $region ec2 terminate-instances --instance-ids $id" >> terminate-instance.sh chmod +x terminate-instance.sh
After substituting the required variables at the top with your real values you can run this script. Notice that after creating the VM I capture the instance details in a file & the ID in a variable so I can subsequently tag it, and then I create a termination script…this makes for very simple operations when you need to repeatedly start and then kill/destroy/delete a VM.
Using these scripts should come in quite handy. A copy of create-instance.sh can be found on my github here.
One other thing… I use the normal AWS CLI for automation as shown here…but for poking around interactively I use something called ‘aws-shell’ formerly ‘saw’. Check it out and you won’t be disappointed !
My next post will be on Terraform or the Go SDK…but both are coming soon!