Aws-cli: Como descrever instâncias de todas as regiões?

Criado em 8 fev. 2016  ·  17Comentários  ·  Fonte: aws/aws-cli

Estou tentando mudar meu fluxo de trabalho para o cli do painel de controle aws, mas me deparei com um problema muito estranho. Eu sei como descrever instâncias dentro de uma região, mas como descrevo todas as minhas instâncias independentemente das regiões? Ou pelo menos obter uma saída de todas as regiões ec2 para que eu possa fazer isso programaticamente um por um (ou seja, algo como aws ec2 list-regions ).

É muito estranho porque o cli parece usar nomes diferentes para regiões do que o painel de controle. Por um lado, aparentemente todas as minhas instâncias estão sendo iniciadas na região "us-west-2" (pelo menos até agora), mas não consigo encontrar essa string em nenhum lugar no painel de controle. Na verdade, não consigo encontrar nenhum lugar listando minha região padrão.

Existe um comando dentro do aws que faz isso?

Comentários muito úteis

Para as pessoas que chegam aqui do Google, aqui está uma maneira de listar todas as suas instâncias em todas as regiões com a AWS CLI (com base na discussão acima):

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 comentários

O console não permite listar todas as instâncias, independentemente da região, mas oculta os identificadores de região com um texto mais descritivo. us-west-2 é o datacenter localizado em Oregon, por exemplo. Há um menu suspenso no canto superior direito da página do console que permite selecionar uma região (foto abaixo).

Para a maioria dos serviços, não existe atualmente uma forma programática de descobrir quais regiões estão disponíveis e, portanto, você precisará consultar esta lista . O EC2 é uma das exceções, no entanto, pois fornece a função describe-regions . Como a CLI é um wrapper sobre APIs de serviço, não podemos fazer pesquisas em várias regiões, a menos que o serviço a suporte (o S3, por exemplo, é principalmente independente de região). Você terá que fornecer à região o argumento --region para consultar em uma região diferente.

Sua região padrão está localizada em seu arquivo de configuração ( ~/.aws/config em sistemas UNIX) e pode ser mostrada e configurada com o comando aws configure .

regions

Para as pessoas que chegam aqui do Google, aqui está uma maneira de listar todas as suas instâncias em todas as regiões com a AWS CLI (com base na discussão acima):

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 aqueles de vocês que também não querem analisar JSON com seus olhos, aqui está uma versão anexada que usa jq para fornecer um resumo um pouco mais

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

Saída de exemplo:

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"
}

@nonbeing Legal! Se você usa isso com frequência, considere torná-lo um alias .

Outra opção seria usar o módulo AWS PowerShell .NET Core, que é executado nativamente em Linux, Mac e 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

Saída usando Format-Table

Por padrão, na versão atual do módulo AWS PowerShell, as instâncias do EC2 são retornadas no formato "lista" do PowerShell. No entanto, isso é facilmente alterado para formatação tabular, usando o 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}

Você pode usar jq , se quiser adicionar mais dependências, ou apenas usar o --query integrado na AWS CLI:
aws --profile whatever ec2 describe-instances --query 'Reservations[].Instances[].[State.Name,InstanceType]' [ [ "running", "t2.small" ], [ "running", "t2.small" ], [ "running", "m3.medium" ] ]

enquanto lê -rr; região inicial do eco: $r; faça enquanto lê -ri ; faça eco instance-id: $i 2>&1 ; done < <(aws ec2 describe-instances --query "Reservations[].Instances[].InstanceId" --region $r --profile prd|perl -nl -e 's/\s+/\n/g;print '); echo "parar região: $r" ; feito < <(aws ec2 describe-regions --output text --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

Apenas outra solução que acabei de escrever!
Este pequeno script pode executar comandos em todas as regiões
Exemplos de uso:
sudo ./aws-x.sh ec2 describe-instances
sudo ./aws-x.sh ec2 describe-instances | grep PrivateDnsName

!/bin/bash

echo "Obter regiões disponíveis da AWS:"
sudo aws ec2 describe-regions --region eu-west-2 |grep RegionName |cut -d '"' -f 4 > /tmp/regions.txt
cat /tmp/regions.txt

Comece a executar

enquanto lê a região; Faz
echo "Executando " $@ " em " $region ":"
aws --região $região $@
feito

limpar

rm /tmp/regions.txt

!/bin/bash

echo Capturando instâncias em todas as regiões, aguarde..
para região em aws ec2 describe-regions --output text | cut -f3
Faz
aws ec2 describe-instances --region $region --query 'Reservations[].Instances[].[State.Name,InstanceType,PublicIpAddress,Placement.AvailabilityZone]' --output text
feito

------saída-------

./get-instances.sh

Capturando instâncias em todas as regiões, aguarde.

executando t2.micro 54.93.120.174 eu-central-1b

executando t2.micro 54.86.91.202 us-east-1d

Para aqueles de vocês que também não querem analisar JSON com seus olhos, aqui está uma versão anexada que usa jq para fornecer um resumo um pouco mais

aws cli suporta o parâmetro "query" , que faz isso como um build-in.

Obrigado obijan! Comecei a usar jq alguns meses atrás e isso mudou minha vida :)

Observe que os AWS Cli Docs ainda recomendam o JQ para uso mais avançado:

Se você precisar de recursos mais avançados que podem não ser possíveis com --query, você pode conferir jq, um processador JSON de linha de comando. Você pode baixá-lo e encontrar o tutorial oficial em http://stedolan.github.io/jq/

IMHO, --query ainda vale a pena procurar se funciona para o seu caso de uso de consulta, pois é suportado nativamente pela AWS CLI. Esta opção foi adicionada no aws cli v. 1.2.0 que foi lançado em 2013/10/18 , então você definitivamente deveria ter esta opção a menos que você tenha uma versão antiga da CLI.

Se você preferir usar o parâmetro --query , observe que ele usa JMESPath como sua linguagem de consulta (a página inicial tem um testador JMESPath ativo). O tutorial também vale a pena.


Comparação de amostra de uma consulta semelhante

As consultas a seguir listam as instâncias do RDS na região padrão usando o aws cli, analisando a saída json dele usando JQ e JMESPath

Por exemplo, uma consulta semelhante parece ser OOTB muito mais legível no 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
        ]
    ]
]

Se opt-in-not-required for a 3ª coluna de saída quando você executar aws ec2 describe-regions --output text , você poderá alterar cut -f3 para cut -f4 assim:

for region in `aws ec2 describe-regions --output text | cut -f4`
do

done

Provavelmente, uma maneira mais robusta é usar uma consulta JMESPath da seguinte maneira:

for region in $(aws ec2 describe-regions --query "Regions[*].RegionName" --output text)
do

done

Você também pode fazer algumas análises adicionais para filtrar as regiões que deseja com grep .
Por exemplo, depois de instalar awscli-aliases , adicione o seguinte a ~/.aws/cli/alias para listar suas instâncias:

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 um filtro ao código da região, por exemplo, us para regiões dos EUA:

$ aws list-instances 'us'

para região em aws ec2 describe-regions --output text | cut -f3
Faz
echo -e "\nListando instâncias na região:'$region'..."
aws ec2 describe-instances --region $region | grep executando > arquivo.txt
cat arquivo.txt | wc -l
feito

image

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

alexejk picture alexejk  ·  3Comentários

motilevy picture motilevy  ·  3Comentários

vadimkim picture vadimkim  ·  3Comentários

ikim23 picture ikim23  ·  3Comentários

pawelkilian picture pawelkilian  ·  3Comentários