Estoy tratando de cambiar mi flujo de trabajo a la cli desde el panel de control de aws, pero me encontré con un problema muy extraño. Sé cómo describir instancias dentro de una región, pero ¿cómo describo todas mis instancias independientemente de las regiones? O al menos obtener una salida de todas las regiones ec2 para que pueda hacer esto mediante programación una por una (es decir, algo como aws ec2 list-regions
).
Es muy extraño porque la cli parece usar nombres diferentes para las regiones que el panel de control. Por un lado, aparentemente todas mis instancias se están iniciando en la región "us-west-2" (al menos hasta ahora), pero no puedo encontrar esa cadena en ninguna parte del panel de control. De hecho, parece que no puedo encontrar ningún lugar que incluya mi región predeterminada.
¿Hay un comando dentro de aws que haga esto?
La consola no le permite enumerar todas las instancias independientemente de la región, pero oculta los identificadores de región con un texto más descriptivo. us-west-2
es el centro de datos ubicado en Oregón, por ejemplo. Hay un menú desplegable en la parte superior derecha de la página de la consola que le permite seleccionar una región (en la imagen a continuación).
Para la mayoría de los servicios, actualmente no existe una forma programática de descubrir qué regiones están disponibles, por lo que deberá consultar esta lista . Sin embargo, EC2 es una de las excepciones, ya que proporciona la función describe-regions
. Dado que la CLI es un contenedor sobre las API del servicio, no podemos realizar búsquedas en varias regiones a menos que el servicio lo admita (S3, por ejemplo, es principalmente independiente de la región). Deberá proporcionar a la región el argumento --region
para consultar en una región diferente.
Su región predeterminada se encuentra en su archivo de configuración ( ~/.aws/config
en sistemas UNIX), y se puede mostrar y configurar con el comando aws configure
.
Para las personas que llegan aquí desde Google, aquí hay una forma de enumerar todas sus instancias en todas las regiones con la CLI de AWS (según la discusión anterior):
for region in `aws ec2 describe-regions --output text | cut -f3`
do
echo -e "\nListing Instances in region:'$region'..."
aws ec2 describe-instances --region $region
done
Para aquellos de ustedes que tampoco quieren analizar JSON con sus globos oculares, aquí hay una versión adjunta que usa jq para darle un poco más de resumen.
for region in `aws ec2 describe-regions --output text | cut -f3`
do
echo -e "\nListing Instances in region:'$region'..."
aws ec2 describe-instances --region $region | jq '.Reservations[] | ( .Instances[] | {state: .State.Name, name: .KeyName, type: .InstanceType, key: .KeyName})'
done
Salida de ejemplo:
Listing Instances in region:'us-west-1'...
{
"state": "stopped",
"name": "scanner-1",
"type": "t2.micro",
"key": "scan1"
}
{
"state": "stopped",
"name": "cors",
"type": "t2.micro",
"key": "cors"
}
{
"state": "stopped",
"name": "scanner-2",
"type": "t2.medium",
"key": "scan2"
}
@non being ¡Agradable! Si lo usa con frecuencia, debería considerar convertirlo en un alias .
Otra opción sería utilizar el módulo AWS PowerShell .NET Core, que se ejecuta de forma nativa en Linux, Mac y Windows.
foreach ($Region in (Get-AWSRegion)) {
Get-EC2Instance -Region $Region.Region
}
GroupNames : {}
Groups : {}
Instances : {asdf}
OwnerId : 123
RequesterId : 123
ReservationId : r-asdf
GroupNames : {}
Groups : {}
Instances : {asdf}
OwnerId : 123
RequesterId : 123
ReservationId : r-asdf
GroupNames : {}
Groups : {}
Instances : {asdf}
OwnerId : 123
RequesterId : 123
ReservationId : r-asdf
De forma predeterminada, en la versión actual del módulo de AWS PowerShell, las instancias EC2 se devuelven en el formato de "lista" de PowerShell. Sin embargo, esto se cambia fácilmente a formato tabular, usando el comando Format-Table
.
$InstanceList = @()
foreach ($Region in (Get-AWSRegion)) {
$InstanceList += Get-EC2Instance -Region $Region.Region -ProfileName CIDBTest
}
$InstanceList | Format-Table
GroupNames Groups Instances OwnerId RequesterId ReservationId RunningInstance
---------- ------ --------- ------- ----------- ------------- ---------------
{} {} {asdf222} 123 123 r-123 {asdf222}
{} {} {asdf222} 123 123 r-123 {asdf222}
{} {} {asdf222} 123 123 r-123 {asdf222}
Podría usar jq
, si desea agregar más dependencias, o simplemente usar el --query
integrado en AWS CLI:
aws --profile whatever ec2 describe-instances --query 'Reservations[].Instances[].[State.Name,InstanceType]'
[
[
"running",
"t2.small"
],
[
"running",
"t2.small"
],
[
"running",
"m3.medium"
]
]
mientras lee -rr ; región de inicio de eco: $r; hacer mientras se lee -ri ; hacer eco id-instancia: $i 2>&1 ; hecho < <(aws ec2 describe-instances --query "Reservaciones[].Instancias[].InstanceId" --region $r --profile prd|perl -nl -e 's/\s+/\n/g;print '); echo "región de parada: $r" ; hecho < <(aws ec2 describe-regiones --texto de salida --profile prd| cut -f 3)
for region in `aws ec2 describe-regions --output text | cut -f3`
do
echo -e "\nListing Instances in region:'$region'..."
aws ec2 describe-instances --region $region | jq '.Reservations[] | ( .Instances[] | {state: .State.Name, name: .KeyName, Tag_Name: .Tags[].Value,type: .InstanceType, key: .KeyName})'
done
¡Solo otra solución que acabo de escribir!
Este pequeño script puede ejecutar comandos en todas las regiones
Ejemplos de uso:
sudo ./aws-x.sh ec2 describe-instancias
sudo ./aws-x.sh ec2 describir-instancias | grep PrivateDnsName
echo "Obteniendo regiones disponibles de AWS:"
sudo aws ec2 describe-regiones --region eu-west-2 |grep RegionName |cut -d '"' -f 4 > /tmp/regions.txt
cat /tmp/regiones.txt
mientras lee la región; hacer
echo "Ejecutando " $@ " en " $región ":"
aws --región $región $@
hecho
rm /tmp/regiones.txt
echo Tomando instancias en todas las regiones, espere...
para región en aws ec2 describe-regions --output text | cut -f3
hacer
aws ec2 describe-instances --region $region --query 'Reservations[].Instances[].[State.Name,InstanceType,PublicIpAddress,Placement.AvailabilityZone]' --output text
hecho
Para aquellos de ustedes que tampoco quieren analizar JSON con sus globos oculares, aquí hay una versión adjunta que usa jq para darle un poco más de resumen.
aws cli es compatible con el parámetro "query" , que hace esto como una función integrada.
Gracias obijan! Empecé a usar jq hace unos meses y cambió mi vida :)
Tenga en cuenta que AWS Cli Docs aún recomienda JQ para un uso más avanzado:
Si necesita funciones más avanzadas que podrían no ser posibles con --query, puede consultar jq, un procesador JSON de línea de comandos. Puede descargarlo y encontrar el tutorial oficial en http://stedolan.github.io/jq/
En mi humilde opinión, todavía vale la pena buscar --query
si funciona para su caso de uso de consulta, ya que es compatible de forma nativa con AWS CLI. Esta opción se agregó en aws cli v. 1.2.0, que se lanzó el 18/10/2013 , por lo que definitivamente debería tener esta opción a menos que tenga una versión antigua de la CLI.
Si prefiere usar el parámetro --query
, tenga en cuenta que usa JMESPath como lenguaje de consulta (la página de inicio tiene un probador de JMESPath en vivo). El tutorial también vale la pena echarle un vistazo.
Las siguientes consultas enumeran las instancias de RDS en la región predeterminada usando aws cli, analizando la salida json usando JQ y JMESPath
Por ejemplo, una consulta similar parece ser mucho más legible OOTB en JMESPath:
# Using Jquery
aws rds describe-db-instances --output json | jq -r '.DBInstances[] | "\(.DBInstanceIdentifier) -> \(.DBInstanceStatus) ( \(.DBInstanceClass), \(.Endpoint.Address):\(.Endpoint.Port) ) " '
## Outputs
someinstancename -> available ( db.t2.small, xxxxx.rds.amazonaws.com:1234 )
## Show a list of properties for DBInstances which have a status containing the word 'avail'
aws rds describe-db-instances --output json --query "DBInstances[?contains(DBInstanceStatus, 'avail')].[DBInstanceIdentifier, DBInstanceClass, DBInstanceStatus, Endpoint.[Address, Port]]"
## Outputs
[
[
"someinstancename",
"db.t2.small",
"available",
[
"xxxxx.rds.amazonaws.com",
1234
]
]
]
Si opt-in-not-required
es la tercera columna de salida cuando ejecuta aws ec2 describe-regions --output text
, puede cambiar cut -f3
a cut -f4
así:
for region in `aws ec2 describe-regions --output text | cut -f4`
do
done
Probablemente una forma más robusta es usar una consulta JMESPath de la siguiente manera:
for region in $(aws ec2 describe-regions --query "Regions[*].RegionName" --output text)
do
done
También puede realizar un análisis adicional para filtrar las regiones que desee con grep
.
Por ejemplo, después de instalar awscli-aliases , agregue lo siguiente a ~/.aws/cli/alias
para enumerar sus instancias:
list-instances =
!f() {
echo "Filtering by \`$1\`"
for region in $(aws ec2 describe-regions --query "Regions[*].RegionName" --output text | tr "\t" "\n" | grep "$1")
do
echo "\nListing Instances in region:'$region'..."
aws ec2 describe-instances --region $region \
--output table \
--query "Reservations[*].Instances[*].{
Instance:InstanceId,
Type:InstanceType,
AZ:Placement.AvailabilityZone,
KeyName:KeyName,
Name:Tags[?Key==\`Name\`]|[0].Value,
Project:Tags[?Key==\`project\`]|[0].Value,
IP:PublicIpAddress,
State:State.Name,
CPUcores:CpuOptions.CoreCount,
CPUThreads:CpuOptions.ThreadsPerCore
}"
done
}; f
Uso:
$ aws list-instances
Aplique un filtro al código de región, por ejemplo, us
para las regiones de EE. UU.:
$ aws list-instances 'us'
para región en aws ec2 describe-regions --output text | cut -f3
hacer
echo -e "\nListado de instancias en la región:'$región'..."
aws ec2 describe-instancias --región $región | grep en ejecución > archivo.txt
archivo gato.txt | wc-l
hecho
Comentario más útil
Para las personas que llegan aquí desde Google, aquí hay una forma de enumerar todas sus instancias en todas las regiones con la CLI de AWS (según la discusión anterior):