web-dev-qa-db-fra.com

Liste du nom de l'instance parmi d'autres données avec aws-cli 1.3.6

Utilisation de aws-cli 1.3.6 J'essaie d'obtenir un tableau simple de mes instances ec2 avec le nom et l'état. J'ai consulté la documentation --query et JMESpath et j'ai pu sélectionner l'élément "Valeur" d'une carte, l'élément "Clé" étant égal à Nom. Ceci est utile pour obtenir le nom de l'instance. Par conséquent, le code ci-dessous semble fonctionner

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value'

Et offre ceci:

-------------------
|DescribeInstances|
+-----------------+
|  Name1          |
|  Name2          |
+-----------------+

Cependant, si je veux ajouter l'état, les choses ne se passent pas comme je l'aurais prévu. En utilisant

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value,State.Name]'

Livre

-------------------
|DescribeInstances|
+-----------------+
|  Name1          |
|  stopped        |
|  Name2          |
|  stopped        |
+-----------------+

au lieu d'une table à deux colonnes avec nom et état. 

Si nous convertissons la sortie en JSON, nous pouvons voir que la sélection Balises renvoie une liste (liste à un élément) et c'est probablement le problème:

[
    [
        [
            "Name1"
        ],
        "stopped"
    ],
    [
        [
            "Name2"
        ],
        "stopped"
    ]
]

Je n'ai pas pu transformer cette liste en scalaire en sélectionnant le premier élément. Cela ne fonctionne pas. Renvoie une liste vide sous le nom.

aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[0],State.Name]'

La même chose que ça

aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[][0],State.Name]'

La seule façon pour moi de résoudre ce problème consiste à utiliser la fonction de jointure. Comme je n’attends qu’un élément, c’est correct mais il me semble être un peu hacky. 

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[join(`,`,Tags[?Key==`Name`].Value),State.Name]'

---------------------------
|    DescribeInstances    |
+-------------+-----------+
|  Name1      |  stopped  |
|  Name2      |  stopped  |
+-------------+-----------+

La question qui se pose est donc la suivante: existe-t-il un moyen de choisir le premier élément du résultat du filtre (?Key==XXXX), sachant que le suffixe avec [0] ne semble pas fonctionner?

Merci d'avance!

28
c-garcia

La question qui se pose est donc la suivante: existe-t-il un moyen de choisir le premier élément du résultat du filtre (? Key == XXXX), en gardant à l’esprit que le suffixe avec [0] ne semble pas fonctionner?

La façon dont vous avez formulé cette question laisse entrevoir la solution, à savoir Pipe Expressions (disponible uniquement à partir de la version 1.3.7 du aws-cli bien que, par conséquent, impossible à déterminer au moment des questions):

pipe-expression  = expression "|" expression

Une expression de canal combine deux expressions, séparées par le | personnage. C'est semblable à une sous-expression avec deux importants distinctions:

  1. Toute expression peut être utilisée à droite. Une sous-expression limite le type d'expression utilisable de la main droite côté.
  2. Une expression_pipe arrête les projections du côté gauche pour se propager vers le côté droit. Si l'expression de gauche crée un projection, elle ne s’applique pas du côté droit.

La partie soulignée est la clé, comme le montrent les exemples suivants, notamment:

Si vous ne vouliez que la première liste secondaire, ["first1", "second1"], vous pouvez utiliser une expression pipe:

foo[*].bar[0] -> ["first1", "first2"]
foo[*].bar | [0] -> ["first1", "second1"]

Solution

Ainsi, appliquer une expression de tuyau donne le résultat souhaité:

aws ec2 describe-instances --output table \
  --query 'Reservations[].Instances[].[Tags[?Key==`Name`] | [0].Value, State.Name]'

----------------------------------
|        DescribeInstances       |
+--------------------+-----------+
|  Name1             |  stopped  |
|  Name2             |  stopped  |
+--------------------+-----------+
24
Steffen Opel

Il indique l'ID d'instance avec l'état du serveur

Commande: Aws ec2 describe-instances --filter Nom = balise: Nom, Valeurs = eep --query 'Reservations [] .Instances []. {Id: Etat, ID: InstanceId } '--output table

Partie de requête dans la commande ci-dessus Elle change selon l'exigence -- requête 'Reservations [] .Instances []. {Id: State, ID: InstanceId}' - table de sortie

1
Jitendra Bhalothia
#!/bin/bash
for r in `aws ec2 describe-regions --query Regions[*].RegionName --output text`
do

    #echo $r
    aws ec2 describe-instances --region $r --query 'Reservations[*].Instances[*].{ID:InstanceId, type:InstanceType, launched:LaunchTime, name:Tags[?Key==`Name`].Value[]}' --output json | jq --arg R $r -r '.[] | .[] | [$R, .ID, .type, .launched, .name[0]] | @csv'

done

Sortie:

"us-east-1","i-054f8253b9ed0746d","t2.micro","2018-10-31T01:57:52.000Z","xxx"
"us-east-1","i-0638792b8b3057ce2","t2.nano","2018-10-23T03:49:24.000Z","yyy"
0
Junhui Liu