Wednesday, February 28, 2018

Query AWS EC2 nodes launched older than a certain date

The AWS CLI allows for querying and filtering results, but I was having issues with creating a script to give me a list of running nodes launched more than 10 minutes ago.

Below is an example of how to do this.

#!/bin/bash

# Example how to query AWS for nodes that have been online older than a certain date
# Example below returns just the "Name" tag value (intent is for looping through for other actions)
# Example below also filters by "state=running" to excluded stopped or pending instances

# To get newer than a certain date, just alter ?LaunchTime<=${ec2_older_than_date} for the <= to be >=

query_older_than_minutes=10

# sed line conforms date output to AWS's datetime format
ec2_older_than_date=$(date --date='-10 minutes' --utc "+%FT%T.%N" | sed -r 's/[[:digit:]]{6}$/Z/')
# add backticks to variable for inclusion in AWS call
ec2_older_than_date="\`${ec2_older_than_date}\`"

aws_servers=$(aws ec2 describe-instances --filters "Name=tag:APPGROUP,Values=myfunapp" "Name=instance-state-name,Values=running" --query "Reservations[].Instances[?LaunchTime<=${ec2_older_than_date}].[Tags[?Key==\`Name\`].Value]" --output text)

view the gist

The "aws_servers" could then be looped (for server in ${aws_servers}; do ...)