How to List all AMIs for each region in AWS

by Dr. Phil Winder , CEO

A current project required a list of Amazon Machine Images (AMIs) for all regions for use in terraform. I couldn’t find a script to do this for me, so here you will find one that uses the aws cli, jq and a bit of Bash.

To use it, simply pass the full name of the image you want to find in each region. This must be unique or else it will just pick the first AMI. For example:

$ ./images.sh RHEL-7.4_HVM_GA-20170808-x86_64-2-Hourly2-GP2
"ap-south-1" = "ami-e41b618b"
"eu-west-3" = "ami-39902744"
"eu-west-2" = "ami-a1f5e4c5"
"eu-west-1" = "ami-bb9a6bc2"
"ap-northeast-2" = "ami-0f5a8361"
"ap-northeast-1" = "ami-30ef0556"
"sa-east-1" = "ami-a789ffcb"
"ca-central-1" = "ami-dad866be"
"ap-southeast-1" = "ami-10bb2373"
"ap-southeast-2" = "ami-ccecf5af"
"eu-central-1" = "ami-d74be5b8"
"us-east-1" = "ami-c998b6b2"
"us-east-2" = "ami-cfdafaaa"
"us-west-1" = "ami-66eec506"
"us-west-2" = "ami-9fa343e7"

The script is below:

#!/bin/bash
if [ -z "$1" ] ; then
    echo "Please pass the name of the AMI"
    exit 1
fi

IMAGE_FILTER="${1}"

declare -a REGIONS=($(aws ec2 describe-regions --output json | jq '.Regions[].RegionName' | tr "\\n" " " | tr -d "\\""))
for r in "${REGIONS[@]}" ; do
    ami=$(aws ec2 describe-images --query 'Images[*].[ImageId]' --filters "Name=name,Values=${IMAGE_FILTER}" --region ${r} --output json | jq '.[0][0]')
    printf "\\"${r}\\" = ${ami}\\n"
done

More articles

Introduction to Monitoring Microservices with Prometheus

Learn how to monitor microservices with Prometheus. Expert-led introduction from Phil Winder.

Read more

Logging vs Tracing vs Monitoring

Monitoring != Logging != Tracing. Learn the differences between these three fundamental cloud-native concepts. Find out the uses cases for each technology.

Read more
}