Wie würden Sie Instanzen mit aws cli in bestimmten VPCs mit dem Tag-Namen, der privaten IP-Adresse der Instanz und der Instanz-ID auflisten?

19

Als Nächstes verwende ich die folgenden Befehle.

Mit diesem Befehl können Sie alle Namen von Instanzen auflisten.

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

Mit diesem Befehl können Sie alle privaten IP-Adressen, Instanz-IDs und ALLEN Tags auflisten, die ich nicht benötige. Ich brauche nur den Namen.

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

Ich bin mir nicht sicher, warum ich den Befehl nicht so ausführen kann:

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

Dieser Befehl funktioniert, zeigt jedoch alle Tags-Schlüsselnamen an.

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags'
Imagineer
quelle
1
Kopieren Sie diese Befehle einfach von irgendwoher, ohne zu verstehen, was sie tun?
Michael Hampton
Nicht wirklich, ich habe versucht zu verstehen, wie man jq benutzt und wie man die grundlegende json Ausgabe erhält, die ich will. Ich konnte jedoch keine Beispiele dafür finden, was ich erreichen möchte. Die Verwendung von "Tags [? Key == Name] .Value []" als Filter für die Ausgabe von Schlüsselnamen und -werten ist nur nach aws-cli v1.3.0 möglich. Und ich benutze eine Kombination aus --filter und jq, um die gewünschte Ausgabe zu erhalten. Der nächste Befehl lautet aws ec2 describe-instance --filters Name = vpc-id, Values ​​= vpc-e2f17e8b | jq '.Reservations []. Instances [] | {PrivateIpAddress, InstanceId, Tags} 'Ich muss nur wissen, wie ich mit jq auf den Tag Key = Name verweisen kann.
Imagineer

Antworten:

24

Sie müssen die Backslashes umgehen, um die Antwort korrekt zu formatieren.

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

Das ist also der eigentliche Befehl, den Sie wollen:

$ 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

Und du brauchst nicht .Value[]. Sie können nur verwenden .Value, und das wird die gleiche Ausgabe geben.

Das ist übrigens großartig. Ich werde das selbst umsetzen!

KORREKTUR: Das obige funktioniert nicht, wenn der Wert von .Value"None" ist. Das funktioniert besser:

$ 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
quelle
Können Sie bitte Ihren sed-Befehl erklären? Ich bekomme Instanz-IDs / Namen von einem ab, was möglicherweise daran liegt, dass ich die indirekte Shell-Erweiterung in der sed nicht verstehe.
Jorfus
3
Wenn eine Instanz nicht benannt ist (Tag: key = Name nicht festgelegt), wird die nächste Instanz in derselben Zeile gedruckt. Der erste sed-Befehl gibt die Zeichenfolge "None \ n" aus, um dieses Problem zu beheben. Der zweite sed-Befehl entfernt den Zeilenvorschub von der Instanz-ID, sodass die Zeichenfolge Tag: key = Name in derselben Zeile gedruckt wird.
DrStrangepork
8

Versuche dies

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value|[0],State.Name,PrivateIpAddress,PublicIpAddress]' --output text | column -t
Alf-Man
quelle
3
Sie sollten eine Erklärung für Ihren Code hinzufügen. Es ist nützlicher zu beschreiben, wie und warum dieser Code das Problem löst, da er dem OP und anderen Lesern hilft, dieses und ähnliche Probleme selbst zu lösen.
Anthony G - Gerechtigkeit für Monica
Das funktioniert, aber warum funktioniert es tatsächlich? |ist eine Art Filter?
Airey
7

Die obigen Antworten sind in Ordnung, aber mein Favorit des Gleichen ist;

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

in der Tat kann man es in eine BASH-Funktionslistenliste einfügen;

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 }

dann ruf einfach an der Eingabeaufforderung als 'awsls' an

Jorge de la Torre
quelle
Wie fügt man mehrere Funktionen in eine Datei ein und ruft einfach die gewünschte Funktion auf?
Stryker
2

Etwas wie das?

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

Ich habe einen Filter für den Status "running" hinzugefügt. Poste es hier, falls es für irgendjemanden hilfreich ist.

Mein Anwendungsfall ist etwas anders. Ich erstelle Ansible-Hostdateien, also möchte ich nur einen privaten IP-Namen auf allen laufenden Hosts.

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
quelle
0

Fügen Sie dies für Leute hinzu, die diesen Beitrag bei der Suche nach Informationen zu Ihrer Instanz finden. Sie können der select-Anweisung eine VPC hinzufügen, um diese ebenfalls zu erhalten.

In Powershell können Sie Folgendes verwenden:

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

Mit der AWS-CLI können Sie Folgendes verwenden:

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
quelle
Ich habe Ihre Antwort bearbeitet, um die Befehle als Befehle / Code zu formatieren. Würden Sie bitte überprüfen, ob der Punkt am Ende Ihres ersten Befehls vorhanden sein muss? Wenn nicht, bitte
korrigieren