Aws-cli: Comment décrire les instances de toutes les régions ?

CrĂ©Ă© le 8 fĂ©vr. 2016  Â·  17Commentaires  Â·  Source: aws/aws-cli

J'essaie de basculer mon flux de travail vers le cli à partir du panneau de configuration aws, mais j'ai rencontré un problÚme trÚs étrange. Je sais comment décrire des instances au sein d'une région, mais comment décrire toutes mes instances indépendamment des régions ? Ou au moins obtenir une sortie de toutes les régions ec2 afin que je puisse le faire par programmation une par une (c'est-à-dire quelque chose comme aws ec2 list-regions ).

C'est trÚs étrange car le cli semble utiliser des noms de régions différents de ceux du panneau de configuration. D'une part, apparemment toutes mes instances sont démarrées dans la région "us-west-2" (au moins jusqu'à présent), mais je ne trouve cette chaßne nulle part dans le panneau de configuration. En fait, je n'arrive pas à trouver du tout la liste de ma région par défaut.

Existe-t-il une commande à l'intérieur d'aws qui fait cela?

Commentaire le plus utile

Pour les personnes arrivant ici de Google, voici une façon de répertorier toutes vos instances dans toutes les régions avec l'AWS CLI (sur la base de la discussion ci-dessus) :

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

Tous les 17 commentaires

La console ne vous permet pas de répertorier toutes les instances quelle que soit la région, mais elle masque les identifiants de région avec un texte plus descriptif. us-west-2 est le centre de données situé dans l'Oregon, par exemple. Il y a un menu déroulant en haut à droite de la page de la console qui vous permet de sélectionner une région (illustré ci-dessous).

Pour la plupart des services, il n'existe actuellement aucun moyen programmatique de dĂ©couvrir quelles rĂ©gions sont disponibles, vous devrez donc vous rĂ©fĂ©rer Ă  cette liste . EC2 est cependant l'une des exceptions, car il fournit la fonction describe-regions . Étant donnĂ© que la CLI est un wrapper sur les API de service, nous ne pouvons pas effectuer de recherches multirĂ©gionales Ă  moins que le service ne la prenne en charge (S3, par exemple, est principalement indĂ©pendant de la rĂ©gion). Vous devrez fournir Ă  la rĂ©gion l'argument --region pour interroger dans une autre rĂ©gion.

Votre rĂ©gion par dĂ©faut se trouve dans votre fichier de configuration ( ~/.aws/config sur les systĂšmes UNIX), et peut ĂȘtre Ă  la fois affichĂ©e et dĂ©finie avec la commande aws configure .

regions

Pour les personnes arrivant ici de Google, voici une façon de répertorier toutes vos instances dans toutes les régions avec l'AWS CLI (sur la base de la discussion ci-dessus) :

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

Pour ceux d'entre vous qui ne veulent pas non plus analyser JSON avec leurs yeux, voici une version en annexe qui utilise jq pour vous donner un résumé un peu plus précis.

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

Exemple de sortie :

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-ĂȘtre sympa ! Si vous l'utilisez souvent, vous devriez envisager d'en faire un alias .

Une autre option serait d'utiliser le module AWS PowerShell .NET Core, qui s'exécute nativement sur Linux, Mac et Windows.

foreach ($Region in (Get-AWSRegion)) {
  Get-EC2Instance -Region $Region.Region
}

RĂ©sultats

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

Sortie Ă  l'aide de Format-Table

Par défaut, dans la version actuelle du module AWS PowerShell, les instances EC2 sont renvoyées au format « liste » PowerShell. Cependant, cela est facilement modifié en formatage tabulaire, en utilisant la commande Format-Table .

$InstanceList = @()
foreach ($Region in (Get-AWSRegion)) {
  $InstanceList += Get-EC2Instance -Region $Region.Region -ProfileName CIDBTest
}
$InstanceList | Format-Table

RĂ©sultats

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}

Vous pouvez utiliser jq , si vous souhaitez ajouter plus de dépendances, ou simplement utiliser le --query intégré dans l'AWS CLI :
aws --profile whatever ec2 describe-instances --query 'Reservations[].Instances[].[State.Name,InstanceType]' [ [ "running", "t2.small" ], [ "running", "t2.small" ], [ "running", "m3.medium" ] ]

pendant la lecture -rr ; echo rĂ©gion de dĂ©but : $r ; faire pendant la lecture -ri ; faire echo 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 "rĂ©gion d'arrĂȘt : $r" ; done < <(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

Juste une autre solution que je viens d'Ă©crire!
Ce petit script peut exécuter des commandes dans toutes les régions
Exemples d'utilisation :
sudo ./aws-x.sh ec2 describe-instances
sudo ./aws-x.sh ec2 describe-instances | grep PrivateDnsName

!/bin/bash

echo "Obtenir les régions AWS disponibles :"
sudo aws ec2 describe-regions --region eu-west-2 |grep RegionName |cut -d '"' -f 4 > /tmp/regions.txt
cat /tmp/régions.txt

Commencer l'exécution

pendant la lecture de la région ; faire
echo "Exécution de " $@ " sur " $region ":"
aws --région $région $@
Fini

nettoyer

rm /tmp/régions.txt

!/bin/bash

echo Capture d'instances dans toutes les régions, veuillez patienter.
pour la région en aws ec2 describe-regions --output text | cut -f3
faire
aws ec2 describe-instances --region $region --query 'Reservations[].Instances[].[State.Name,InstanceType,PublicIpAddress,Placement.AvailabilityZone]' --output text
Fini

------sortir-------

./get-instances.sh

Saisie d'instances dans toutes les régions, veuillez patienter.

exécutant t2.micro 54.93.120.174 eu-central-1b

exécuter t2.micro 54.86.91.202 us-east-1d

Pour ceux d'entre vous qui ne veulent pas non plus analyser JSON avec leurs yeux, voici une version en annexe qui utilise jq pour vous donner un résumé un peu plus précis.

aws cli prend en charge le paramĂštre "query" , qui fait cela en tant que

Merci obijan ! J'ai commencé à utiliser jq il y a quelques mois et cela a changé ma vie :)

Notez que les documents AWS Cli recommandent toujours JQ pour une utilisation plus avancée :

Si vous avez besoin de fonctionnalitĂ©s plus avancĂ©es qui pourraient ne pas ĂȘtre possibles avec --query, vous pouvez consulter jq, un processeur JSON en ligne de commande. Vous pouvez le tĂ©lĂ©charger et trouver le tutoriel officiel sur http://stedolan.github.io/jq/

À mon humble avis, --query vaut toujours la peine d'ĂȘtre recherchĂ© si cela fonctionne pour votre cas d'utilisation de requĂȘte, car il est pris en charge nativement par l'AWS CLI. Cette option a Ă©tĂ© ajoutĂ©e dans aws cli v. 1.2.0 qui a Ă©tĂ© publiĂ© le 18/10/2013 , vous devriez donc avoir certainement cette option Ă  moins que vous n'ayez une ancienne version de la CLI.

Si vous prĂ©fĂ©rez utiliser le paramĂštre --query , notez qu'il utilise JMESPath comme langage de requĂȘte (la page d'accueil a un testeur JMESPath en direct). Le tutoriel vaut Ă©galement le dĂ©tour.


Exemple de comparaison d'une requĂȘte similaire

Les requĂȘtes suivantes rĂ©pertorient les instances RDS dans la rĂ©gion par dĂ©faut Ă  l'aide de l'aws cli, en analysant la sortie json Ă  l'aide de JQ et JMESPath

Par exemple, une requĂȘte similaire semble ĂȘtre OOTB beaucoup plus lisible dans 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 est la 3Úme colonne de sortie lorsque vous exécutez aws ec2 describe-regions --output text , vous pouvez changer cut -f3 en cut -f4 comme ceci :

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

done

Un moyen probablement plus robuste consiste Ă  utiliser une requĂȘte JMESPath comme suit :

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

done

Vous pouvez également effectuer une analyse plus poussée pour filtrer les régions souhaitées avec grep .
Par exemple, aprÚs avoir installé awscli-aliases , ajoutez ce qui suit à ~/.aws/cli/alias pour répertorier vos instances :

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

Usage:

$ aws list-instances

Appliquez un filtre au code de rĂ©gion, par exemple us pour les rĂ©gions des États-Unis :

$ aws list-instances 'us'

pour la région en aws ec2 describe-regions --output text | cut -f3
faire
echo -e "\nListe des instances dans la région : '$région'..."
aws ec2 describe-instances --region $region | grep en cours d'exécution > fichier.txt
fichier de chat.txt | wc -l
Fini

image

Cette page vous a été utile?
0 / 5 - 0 notes