Versión nueva y mejorada.
# needed as json list returned by ubuntu site is mal-formed
remove_last_comma() { sed '
$x;$G;/\(.*\),/!H;//!{$!d
}; $!x;$s//\1/;s/^\n//'
}
curl -s "https://cloud-images.ubuntu.com/locator/ec2/releasesTable" \
| remove_last_comma \
| jq -c '.aaData[] | select(contains(["16.04", "us-west-2", "hvm:ebs"]))' \
| grep -o 'ami-[a-z0-9]\+' | head -1
Básicamente toma datos sin procesar utilizados para la página de búsqueda de ami de ubuntu, y usa jq para analizar la fila que quiero y luego un grep para extraer el valor. Mucho más rápido que la versión anterior.
-- Versión original
Aquí hay otro ejemplo. Acabo de escribir esto para obtener la última identificación de AMI de confianza. Utiliza la herramienta aws cli para consultar la API, utilizando el hecho de que los nombres se ordenan por fecha para obtener la última.
name=$(\
aws --region us-west-2 ec2 describe-images --owners 099720109477 \
--filters Name=root-device-type,Values=ebs \
Name=architecture,Values=x86_64 \
Name=name,Values='*hvm-ssd/ubuntu-trusty-14.04*' \
| awk -F ': ' '/"Name"/ { print $2 | "sort" }' \
| tr -d '",' | tail -1)
ami_id=$(\
aws --region us-west-2 ec2 describe-images --owners 099720109477 \
--filters Name=name,Values="$name" \
| awk -F ': ' '/"ImageId"/ { print $2 }' | tr -d '",')
Funciona en 2 partes. La primera parte obtiene todas las AMI para ubuntu de confianza que cumplen con los diversos criterios (ebs, x86_64 y el patrón de nombre). Saca el Nombre y lo ordena por él. Los nombres están formateados de modo que al ordenarlos se ordenan por fecha, de modo que el último será el más nuevo. Este nombre se asigna a la variable 'nombre'.
La segunda parte usa ese nombre para solicitar la ID de AMI para la AMI con ese nombre. Analiza solo el id y lo asigna a 'ami_id'.