Brain Droppings

From the mind of Chris Weibel


AWS Instance Counts From BOSH Deployed VMs

13 Oct 2016

map

Photo by Steve Smith on Unsplash

Ever wonder how many of the VMS in AWS Console were deployed via BOSH? How about the number of instance types so you can start using reserved instances?

The script below will show you the number of BOSH deployed VMS you have for each defined director on AWS.

A few assumptions:

  • You can log into each BOSH Director from a single jump box
  • You have a BOSH Client credentials created
  • You have AWS credentials (hint: find your bosh-init manifest)

In the example below there are two directors called useast2-a and useast2-b, each has a set of unique credentials for BOSH and AWS.

function set_env_useast2_a {
  export REPORT_ENV="useast2_a"
  export BOSH_CLIENT=reporting
  export BOSH_CLIENT_SECRET=boshSecret
  export AWS_ACCESS_KEY_ID=AKIANICETRYNOTSODUMB
  export AWS_SECRET_ACCESS_KEY="viooijijobniAoaieuAjblisdfiueBoiuwp8eufg"
  export AWS_DEFAULT_REGION="us-east-2"
  bosh target 192.168.0.2
}

function set_env_useast2_b {
  export REPORT_ENV="useast2_b"
  export BOSH_CLIENT=reporting
  export BOSH_CLIENT_SECRET=boshSecret2
  export AWS_ACCESS_KEY_ID=AKIANICETRYNOTSOTUFF
  export AWS_SECRET_ACCESS_KEY="viooijijobniAoaieuAjblasdfffdadgggdeehgb"
  export AWS_DEFAULT_REGION="us-east-2"
  bosh target 192.168.0.3
}

function generate_files {
  list_of_instances=$(bosh vms --details | grep " i-" | cut -d '|' -f 7)
  aws ec2 describe-instances --instance-ids ${list_of_instances} --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, InstanceType]' --output text > ${REPORT_ENV}.out
  sleep 1
  aws ec2 describe-instances --instance-ids ${list_of_instances} --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, InstanceType]' --output text >> ${AWS_DEFAULT_REGION}.out
  cat ${REPORT_ENV}.out | sort -nr | uniq -c > ${REPORT_ENV}.count.out
  cat ${AWS_DEFAULT_REGION}.out | sort -nr | uniq -c > ${AWS_DEFAULT_REGION}.count.out
}

for set_env in useast2_a useast2_b; do
  eval set_env_${set_env}
  generate_files
done

for aws_region in "us-east-2"; do   # <=== Add more regions here if you have more than 1
  echo "Region: ${aws_region}"
  cat ${aws_region}.count.out
done

Note that you can extend the script to handle multiple regions by simply adding any uniquely defined AWS_DEFAULT_REGIONs in the final for loop. You will also want to wipe out the *.out files between runs.