Aws-cli: ¿Cómo describir instancias de todas las regiones?

Creado en 8 feb. 2016  ·  17Comentarios  ·  Fuente: aws/aws-cli

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?

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):

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

Todos 17 comentarios

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 .

regions

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
}

Resultados

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

Salida usando Format-Table

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

Resultados

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

!/bin/bash

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

Empezar a ejecutar

mientras lee la región; hacer
echo "Ejecutando " $@ " en " $región ":"
aws --región $región $@
hecho

limpiar

rm /tmp/regiones.txt

!/bin/bash

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

------producción-------

./get-instances.sh

Tomando instancias en todas las regiones, espere...

ejecutando t2.micro 54.93.120.174 eu-central-1b

ejecutando t2.micro 54.86.91.202 us-east-1d

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.


Ejemplo de comparación de una consulta similar

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

image

¿Fue útil esta página
0 / 5 - 0 calificaciones