Comment feriez-vous pour répertorier les instances utilisant aws cli dans certains VPC avec le nom de balise, l'adresse IP privée de l'instance et l'ID d'instance?

19

Le plus proche que j'obtiens utilise les commandes suivantes.

Cette commande parvient à répertorier tous les noms d'instances.

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value[]'

Cette commande parvient à répertorier toutes les adresses IP privées, les identifiants d'instance et TOUTES les balises dont je n'ai pas besoin. J'ai juste besoin du nom.

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b | jq '.Reservations[].Instances[] | {PrivateIpAddress, InstanceId, Tags}'

Je ne sais pas pourquoi je ne peux pas exécuter la commande comme ceci:

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags[?Key==`Name`].Value[]'

Cette commande fonctionne mais elle affiche tous les noms des clés des balises.

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags'
Imagineer
la source
1
Copiez-vous simplement ces commandes de quelque part sans essayer de comprendre ce qu'elles font?
Michael Hampton
Pas vraiment, j'ai essayé de comprendre comment utiliser jq et comment obtenir la sortie json de base que je veux. Cependant, je n'ai trouvé aucun exemple de ce que j'essaie de réaliser. L'utilisation de "Tags [? Key == Name] .Value []" comme filtre pour la sortie Key Name Value n'est possible qu'après aws-cli v1.3.0. Et j'utilise une combinaison de --filter et jq pour obtenir la sortie que je veux. La commande la plus proche est aws ec2 describe-instances --filters Name = vpc-id, Values ​​= vpc-e2f17e8b | jq '.Reservations []. Instances [] | {PrivateIpAddress, InstanceId, Tags} 'J'ai juste besoin de savoir comment référencer le Tag Key = Name à l'aide de jq.
Imagineer

Réponses:

24

Vous devez échapper aux barres obliques inverses afin de formater correctement la réponse.

aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'

Voici donc la commande que vous souhaitez:

$ aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-ac973bc9 --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'
10.101.255.10   i-91efd39b Server1
10.101.255.9    i-f1e8d4fb Server2

Et vous n'en avez pas besoin .Value[]. Vous pouvez simplement utiliser .Value, et cela donnera la même sortie.

C'est génial, au fait. Je vais le mettre en œuvre moi-même!

CORRECTION: ce qui précède ne fonctionnera pas si la valeur de .Valueest "None". Cela fonctionne mieux:

$ aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-ac973bc9 --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed 's/None$/None\n/' | sed '$!N;s/\n/ /'
10.101.255.10   i-91efd39b Server1
10.101.255.9    i-f1e8d4fb Server2
10.101.255.8    i-f6c2450a      None
10.101.255.7    i-34a6afce Server3
DrStrangepork
la source
Pouvez-vous expliquer votre commande sed? J'obtiens des ID / noms d'instance par un qui pourrait être parce que je ne comprends pas l'expansion indirecte du shell dans le sed.
jorfus
3
Si une instance n'est pas Nommée (n'a pas Tag: key = Name set), alors l'instance suivante est imprimée sur la même ligne. La première commande sed affiche la chaîne "None \ n" pour atténuer ce problème. La deuxième commande sed supprime le saut de ligne de l'instance-id, de sorte que la chaîne Tag: key = Name s'imprime sur la même ligne.
DrStrangepork
8

Essaye ça

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value|[0],State.Name,PrivateIpAddress,PublicIpAddress]' --output text | column -t
alf-man
la source
3
Vous devez inclure une explication pour votre code. Décrire comment et pourquoi ce code résout le problème est plus utile car il aide le PO et d'autres lecteurs à résoudre eux-mêmes ce problème et des problèmes similaires.
Anthony G - justice pour Monica
Cela fonctionne, mais en effet, pourquoi cela fonctionne-t-il? |est une sorte de filtre?
aairey
7

Les réponses ci-dessus sont OK, mais ma préférée est la même;

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,PrivateIpAddress,PublicIpAddress,Tags[?Key==`Name`].Value[]]' --output json | tr -d '\n[] "' | perl -pe 's/i-/\ni-/g' | tr ',' '\t' | sed -e 's/null/None/g' | grep '^i-' | column -t

en fait, on peut le placer dans une liste de liste de fonctions BASH;

awsls () { aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,PrivateIpAddress,PublicIpAddress,Tags[?Key==`Name`].Value[]]' --output json | tr -d '\n[] "' | perl -pe 's/i-/\ni-/g' | tr ',' '\t' | sed -e 's/null/None/g' | grep '^i-' | column -t }

puis appelez simplement à partir de l'invite en tant que 'awsls'

Jorge de la Torre
la source
Comment ajoutez-vous plusieurs fonctions dans un seul fichier et appelez-vous simplement la fonction que vous souhaitez?
Stryker
2

Quelque chose comme ça?

aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'
Alan
la source
1

J'ai ajouté un filtre pour l'état d'instance "en cours d'exécution". L'afficher ici au cas où cela serait utile pour quiconque.

Mon cas d'utilisation est légèrement différent, je génère des fichiers hôtes Ansible, donc je veux juste un nom IP # privé sur tous les hôtes en cours d'exécution.

aws ec2 describe-instances --profile=$PROFILE --filters Name=vpc-id,Values=$VPCID Name=instance-state-name,Values=running --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed 's/None$/None\n/' | sed '$!N;s/\n/ /' | awk '{print $1 " #" $2 }'
jorfus
la source
0

Ajout de cela pour les personnes qui trouveront ce message lors de la recherche de la façon d'obtenir vos informations d'instance. Vous pouvez également ajouter un VPC dans l'instruction select pour le recevoir également.

Dans PowerShell, vous pouvez utiliser:

(Get-EC2Instance -ProfileName Profile).Instances | select InstanceId,PrivateIPAddress,PublicIpAddress @{Name="Servername";Expression={$_.tags | where key -eq "Name" | select Value -expand Value}} | Format-Table.

Avec l'AWS CLI, vous pouvez utiliser:

aws ec2 describe-instances --region=us-east-1 --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==Name].Value|[0],PrivateIpAddress,PublicIpAddress]' --output text --profile ProfileName
Jose Adams
la source
J'ai édité votre réponse pour formater les commandes en tant que commandes / code. Pourriez-vous s'il vous plaît vérifier que la période à la fin de votre première commande doit être là? Sinon, veuillez le modifier, merci
JimLohse