Ich versuche, meinen Workflow über das AWS-Bedienfeld auf die Cli-Funktion umzustellen, aber ich bin auf ein sehr seltsames Problem gestoßen. Ich weiß, wie man Instanzen innerhalb einer Region beschreibt, aber wie beschreibe ich alle meine Instanzen unabhängig von Regionen? Oder zumindest eine Ausgabe aller ec2-Regionen erhalten, damit ich dies programmatisch nacheinander tun kann (dh so etwas wie aws ec2 list-regions
).
Es ist sehr seltsam, weil die Cli anscheinend andere Namen für Regionen verwendet als das Control Panel. Zum einen werden anscheinend alle meine Instanzen in der Region "us-west-2" gestartet (zumindest bisher), aber ich kann diese Zeichenfolge nirgendwo in der Systemsteuerung finden. Tatsächlich kann ich nirgendwo eine Auflistung meiner Standardregion finden.
Gibt es einen Befehl in aws, der dies tut?
In der Konsole können Sie nicht alle Instanzen unabhängig von der Region auflisten, aber sie blendet die Regions-IDs mit beschreibendem Text aus. us-west-2
ist beispielsweise das Rechenzentrum in Oregon. Oben rechts auf der Konsolenseite befindet sich ein Dropdown-Menü, in dem Sie eine Region auswählen können (siehe Abbildung unten).
Für die meisten Dienste gibt es derzeit keine programmatische Methode, um herauszufinden, welche Regionen verfügbar sind. Daher müssen Sie diese Liste zu describe-regions
bereitstellt. Da die CLI ein Wrapper über Dienst-APIs ist, können wir keine Suche in mehreren Regionen durchführen, es sei denn, der Dienst unterstützt dies (S3 ist beispielsweise meistens regionsunabhängig). Sie müssen der Region das Argument --region
zur Verfügung stellen, um in einer anderen Region abzufragen.
Ihre Standardregion befindet sich in Ihrer Konfigurationsdatei ( ~/.aws/config
auf UNIX-Systemen) und kann mit dem Befehl aws configure
sowohl angezeigt als auch eingestellt werden.
Für Personen, die von Google hierher kommen, können Sie alle Ihre Instanzen in allen Regionen mit der AWS CLI auflisten (basierend auf der obigen Diskussion):
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
Für diejenigen unter Ihnen, die JSON auch nicht mit Ihren Augäpfeln parsen möchten, ist hier eine angehängte Version, die jq verwendet , um Ihnen eine etwas
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
Beispielausgabe:
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 Schön! Wenn Sie dies häufig verwenden, sollten Sie erwägen, es zu einem Alias zu machen .
Eine andere Möglichkeit wäre die Verwendung des AWS PowerShell .NET Core-Moduls, das nativ auf Linux, Mac und Windows ausgeführt wird.
foreach ($Region in (Get-AWSRegion)) {
Get-EC2Instance -Region $Region.Region
}
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
Standardmäßig werden in der aktuellen Version des AWS PowerShell-Moduls die EC2-Instances im PowerShell-Listenformat zurückgegeben. Dies kann jedoch mit dem Befehl Format-Table
leicht in eine tabellarische Formatierung geändert werden.
$InstanceList = @()
foreach ($Region in (Get-AWSRegion)) {
$InstanceList += Get-EC2Instance -Region $Region.Region -ProfileName CIDBTest
}
$InstanceList | Format-Table
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}
Sie können jq
, wenn Sie weitere Abhängigkeiten hinzufügen möchten, oder verwenden Sie einfach das integrierte --query
in AWS CLI:
aws --profile whatever ec2 describe-instances --query 'Reservations[].Instances[].[State.Name,InstanceType]'
[
[
"running",
"t2.small"
],
[
"running",
"t2.small"
],
[
"running",
"m3.medium"
]
]
während gelesen -rr ; Echo-Startregion: $r; tue while read -ri ; do echo Instanz-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 "Region stoppen: $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
Nur eine andere Lösung, die ich gerade geschrieben habe!
Dieses kleine Skript kann Befehle in allen Regionen ausführen
Anwendungsbeispiele:
sudo ./aws-x.sh ec2 describe-instances
sudo ./aws-x.sh ec2 describe-instances | grep PrivateDnsName
echo "Erhalten von verfügbaren AWS-Regionen:"
sudo aws ec2 describe-regions --region eu-west-2 |grep RegionName |cut -d '"' -f 4 > /tmp/regions.txt
cat /tmp/regions.txt
während gelesener Bereich; tun
echo "Ausführen von " $@ " auf " $region ":"
aws --region $region $@
fertig
rm /tmp/regions.txt
echo Grabbing-Instanzen in allen Regionen, bitte warten..
für Region in aws ec2 describe-regions --output text | cut -f3
tun
aws ec2 describe-instances --region $region --query 'Reservations[].Instances[].[State.Name,InstanceType,PublicIpAddress,Placement.AvailabilityZone]' --output text
fertig
Für diejenigen unter Ihnen, die JSON auch nicht mit Ihren Augäpfeln parsen möchten, ist hier eine angehängte Version, die jq verwendet , um Ihnen eine etwas
aws cli unterstützt den Parameter "query" , der diese Dinge als Build-In erledigt.
Danke Obijan! Ich habe vor ein paar Monaten angefangen, jq zu benutzen und es hat mein Leben verändert :)
Beachten Sie, dass die AWS Cli Docs weiterhin JQ für eine erweiterte Verwendung empfehlen:
Wenn Sie erweiterte Funktionen benötigen, die mit --query möglicherweise nicht möglich sind, können Sie jq ausprobieren, einen JSON-Befehlszeilenprozessor. Sie können es herunterladen und finden das offizielle Tutorial unter http://stedolan.github.io/jq/
IMHO, --query
ist immer noch einen Blick wert, ob es für Ihren Abfrageanwendungsfall funktioniert, da es nativ von AWS CLI unterstützt wird. Diese Option wurde in aws cli v. 1.2.0 hinzugefügt , das am
Wenn Sie es vorziehen, den Parameter --query
verwenden, beachten Sie, dass JMESPath als Abfragesprache verwendet wird (die Homepage verfügt über einen Live-JMESPath-Tester). Auch das Tutorial ist einen Blick wert.
Die folgenden Abfragen listen die RDS-Instanzen in der Standardregion mit der aws-Cli auf und parsen die Json-Ausgabe daraus mit JQ und JMESPath
Zum Beispiel scheint eine ähnliche Abfrage OOTB in JMESPath viel besser lesbar zu sein:
# 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
]
]
]
Wenn opt-in-not-required
die dritte Ausgabespalte ist, wenn Sie aws ec2 describe-regions --output text
ausführen, können Sie cut -f3
wie folgt in cut -f4
ändern:
for region in `aws ec2 describe-regions --output text | cut -f4`
do
done
Ein wahrscheinlich robusterer Weg ist die Verwendung einer JMESPath-Abfrage wie folgt:
for region in $(aws ec2 describe-regions --query "Regions[*].RegionName" --output text)
do
done
Sie können auch etwas weiter parsen, um mit grep
nach den gewünschten Regionen zu filtern.
Fügen Sie beispielsweise nach der Installation von ~/.aws/cli/alias
um Ihre Instanzen aufzulisten :
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
Verwendung:
$ aws list-instances
Wenden Sie einen Filter auf den Regionalcode an, z. B. us
für US-Regionen:
$ aws list-instances 'us'
für Region in aws ec2 describe-regions --output text | cut -f3
tun
echo -e "\nInstanzen in der Region auflisten:'$region'..."
aws ec2 describe-instances --region $region | grep läuft > file.txt
cat file.txt | wc -l
fertig
Hilfreichster Kommentar
Für Personen, die von Google hierher kommen, können Sie alle Ihre Instanzen in allen Regionen mit der AWS CLI auflisten (basierend auf der obigen Diskussion):