Aws-cli: Wie beschreibt man Instanzen aus allen Regionen?

Erstellt am 8. Feb. 2016  ·  17Kommentare  ·  Quelle: aws/aws-cli

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?

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):

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

Alle 17 Kommentare

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.

regions

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
}

Ergebnisse

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

Ausgabe mit Format-Tabelle

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

Ergebnisse

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

!/bin/bash

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

Ausführung starten

während gelesener Bereich; tun
echo "Ausführen von " $@ " auf " $region ":"
aws --region $region $@
fertig

Aufräumen

rm /tmp/regions.txt

!/bin/bash

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

------Ausgang-------

./get-instances.sh

Instanzen in allen Regionen werden erfasst, bitte warten..

läuft t2.micro 54.93.120.174 eu-central-1b

Ausführen von t2.micro 54.86.91.202 us-east-1d

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.


Beispielvergleich einer ähnlichen Abfrage

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

image

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

maanbsat picture maanbsat  ·  3Kommentare

pawelkilian picture pawelkilian  ·  3Kommentare

kangman picture kangman  ·  3Kommentare

ypant picture ypant  ·  3Kommentare

ronaldpetty picture ronaldpetty  ·  3Kommentare