Jak wyświetlić wszystkie uruchomione instancje Amazon EC2 we wszystkich regionach?

113

Często przełączam instancje między różnymi regionami i czasami zapominam o wyłączeniu uruchomionej instancji z innego regionu. Nie mogłem znaleźć żadnego sposobu, aby zobaczyć wszystkie uruchomione instancje na konsoli Amazon.
Czy istnieje sposób, aby wyświetlić wszystkie uruchomione instancje niezależnie od regionu?

JerryGoyal
źródło
47
Fakt, że GUI AWS nie pozwala tylko na wyświetlenie wszystkich instancji, jest naprawdę głupi.
Dan Dascalescu
4
Nie jest to idealne i zdecydowanie nieoczywiste, ale możesz użyć Resource Groups > Tag Editorjako opcji GUI. Zobacz moją odpowiedź poniżej.
Heinrich Filter,
3
@DanDascalescu czy na pewno? Jak myślisz, ile pieniędzy zarobił AWS na ludziach takich jak OP, którzy zapomnieli wyłączyć działającą instancję?
smartcaveman
2
@DanDascalescu, jak mówi smartcaveman, jest teraz głupio, jeśli instancje są rozrzucone po wielu regionach i zapomniane, podczas gdy $ ticker tick tyka dla Bezos.
Eduard Rozenberg
2
@DanDascalescu, w jaki sposób mogliby obciążać ludzi za zapominanie instancji, gdyby tylko pokazali, co jest uruchomione ..?
EralpB

Odpowiedzi:

125

Nieoczywistą opcją GUI jest Resource Groups > Tag Editor. Tutaj możesz znaleźć wszystkie instancje we wszystkich regionach, nawet jeśli instancje nie zostały oznaczone. Zrzut ekranu z


EDYCJA: Ten ekran został niedawno przeprojektowany i ma teraz nowy wygląd oraz opcję „Wszystkie regiony”.

Filtr Heinricha
źródło
2
Dzięki, świetny hack!
Rob MacDonald
1
To się znowu zmieniło. Nie widzę już bloku „Regiony” w tym narzędziu. Zamiast tego po prostu pokazuje wszystko w „Bieżącym regionie”. Bóg jeden wie, gdzie to się dzieje ... Mam dość tych idiotów, zakładając, że mam dwadzieścia i 500 maszyn.
punkt przerwania
1
Wygląda na to, że @breakpoint dodali teraz łącze do poprzedniego edytora tagów, który obsługuje wyszukiwanie w wielu regionach.
Heinrich Filter
1
Człowieku, to ratuje życie! Dzięki za udostępnienie! :-D
Lawrence
1
Byłoby wspaniale, gdyby aws miał wbudowaną listę rozwijaną dla „wszystkich regionów” lub podobną
stevec
62

Nie sądzę, że możesz obecnie to zrobić w GUI AWS. Ale oto sposób na wyświetlenie wszystkich instancji we wszystkich regionach za pomocą interfejsu wiersza polecenia AWS:

for region in `aws ec2 describe-regions --region us-east-1 --output text | cut -f4`
do
     echo -e "\nListing Instances in region:'$region'..."
     aws ec2 describe-instances --region $region
done

Zaczerpnięte stąd (jeśli chcesz zobaczyć pełną dyskusję)

Ponadto, jeśli otrzymujesz

Musisz określić region. Możesz także skonfigurować swój region, uruchamiając „aws configure”

Możesz to zrobić za pomocą aws configure set region us-east-1, dzięki @Sabuncu za komentarz.

Aktualizacja

Teraz (w 2019 r.) Polecenie cięcia należy zastosować na 4 polu: cut -f4

imTachu
źródło
13
Aby tego uniknąć cut, możesz użyć:aws ec2 describe-regions --query Regions[*].[RegionName] --output text
stefansundin
Jeśli używasz profili, dodaj --profile nazwa-profilu do obu poleceń aws ec2.
Carlton,
Możesz użyć tego polecenia w systemie Windows 10 CMD, FOR /F %G IN ('aws ec2 describe-regions --query Regions[*].[RegionName] --output text') DO (aws ec2 describe-instances --region %G)
Manjula,
To wydaje się teraz nie działać - You must specify a region. You can also configure your region by running "aws configure".- wydaje się, że określenie regionu jest przeciwieństwem tego, co chcę zrobić
Will Sheppard
@WillSheppard Najpierw musisz skonfigurować swój region; np aws configure set region us-east-1. Wtedy biegając aws ec2 describe-regionsnie powinieneś mieć żadnych problemów. Zobacz odpowiedź: stackoverflow.com/a/46577479/360840, a także inne odpowiedzi w ramach powiązanego pytania.
Sabuncu
19

Rozwiązanie @imTachu działa dobrze. Aby to zrobić za pomocą konsoli AWS ...

  • Konsola AWS
  • Usługi
  • Sieci i dostarczanie treści
  • VPC
  • Poszukaj bloku o nazwie „Uruchomione instancje”, który pokaże bieżący region
  • Kliknij link „Zobacz wszystkie regiony” poniżej
Carlton
źródło
W sekcji „Usługi” nie ma teraz „Sieci i dostarczania treści”
Will Sheppard
2
w konsoli AWS: kliknij „usługi”> w polu tekstowym wpisz „vpc”, a następnie wybierz izolowane zasoby chmurowe
VPC
Zaktualizowali go ponownie. Na desce rozdzielczej EC2 jest teraz skrót. Przejdź do sekcji instancji i kliknij „instancje”. Pokaże Ci wszystkie uruchomione instancje w wybranym regionie.
Mindfulgeek
17
  1. Najpierw przejdź do konsoli zarządzania AWS i kliknij grupę zasobów:

    wprowadź opis obrazu tutaj

  2. Następnie znajdź Network and Content Deliveryi kliknij VPC:

    wprowadź opis obrazu tutaj

  3. Następnie znajdź Uruchomione instancje i rozwiń wyświetl wszystkie regiony. Tutaj możesz znaleźć wszystkie uruchomione instancje z całego regionu:

    wprowadź opis obrazu tutaj

Md Riadul Islam
źródło
13

W konsoli

Przejdź do pulpitu nawigacyjnego VPC https://console.aws.amazon.com/vpc/homei kliknij Running instances-> See all regions.

wprowadź opis obrazu tutaj

W CLI

Dodaj to na przykład do .bashrc. Załaduj ponownie source ~/.bashrci uruchom

Uwaga: Poza aws CLI musisz mieć zainstalowany jq

function aws.print-all-instances() {
  REGIONS=`aws ec2 describe-regions --region us-east-1 --output text --query Regions[*].[RegionName]`
  for REGION in $REGIONS
  do
    echo -e "\nInstances in '$REGION'..";
    aws ec2 describe-instances --region $REGION | \
      jq '.Reservations[].Instances[] | "EC2: \(.InstanceId): \(.State.Name)"'
  done
}

Przykładowe dane wyjściowe:

$ aws.print-all-instances 

Listing Instances in region: 'eu-north-1'..
"EC2: i-0548d1de00c39f923: terminated"
"EC2: i-0fadd093234a1c21d: running"

Listing Instances in region: 'ap-south-1'..

Listing Instances in region: 'eu-west-3'..

Listing Instances in region: 'eu-west-2'..

Listing Instances in region: 'eu-west-1'..

Listing Instances in region: 'ap-northeast-2'..

Listing Instances in region: 'ap-northeast-1'..

Listing Instances in region: 'sa-east-1'..

Listing Instances in region: 'ca-central-1'..

Listing Instances in region: 'ap-southeast-1'..

Listing Instances in region: 'ap-southeast-2'..

Listing Instances in region: 'eu-central-1'..

Listing Instances in region: 'us-east-1'..

Listing Instances in region: 'us-east-2'..

Listing Instances in region: 'us-west-1'..

Listing Instances in region: 'us-west-2'..
sobi3ch
źródło
8

Za każdym razem, gdy tworzysz zasób, oznacz go nazwą, a teraz możesz używać grup zasobów do znajdowania wszystkich typów zasobów z tagiem nazwy we wszystkich regionach.

Mallikarjuna Reddy
źródło
Jeśli znudziło Ci się ręczne tagowanie, użyj Terraform :)
sobi3ch
7

Oparte na odpowiedzi imTachus, ale mniej szczegółowe i szybsze. Musisz mieć zainstalowane jq i aws-cli .

set +m
for region in $(aws ec2 describe-regions --query "Regions[*].[RegionName]" --output text); do 
  aws ec2 describe-instances --region "$region" | jq ".Reservations[].Instances[] | {type: .InstanceType, state: .State.Name, tags: .Tags, zone: .Placement.AvailabilityZone}" &
done; wait; set -m

Skrypt działa aws ec2 describe-instancesrównolegle dla każdego regionu (obecnie 15!) I wyodrębnia tylko odpowiednie bity (stan, tagi, strefa dostępności) z danych wyjściowych json. set +mPotrzebna jest więc procesy tła nie zgłaszają gdy zaczyna / kończy.

Przykładowe dane wyjściowe:

{
  "type": "t2.micro",
  "state": "stopped",
  "tags": [
    {
      "Key": "Name",
      "Value": "MyEc2WebServer"
    },
  ],
  "zone": "eu-central-1b"
}
hansaplast
źródło
4

Po przeczytaniu wszystkich rozwiązań i wypróbowaniu wielu rzeczy, ten, który działał dla mnie, to:

  1. Element listy
  2. Przejdź do grupy zasobów
  3. Edytor tagów
  4. Wybierz wszystkie regiony
  5. Wybierz instancję EC2 w typie zasobu
  6. Kliknij opcję Wyszukaj zasoby

Migawka rozwiązania

Rahul Talreja
źródło
3

Możesz biegać DescribeInstances()we wszystkich regionach.

Dodatkowo możesz:

  • Zautomatyzuj to za pomocą zegarka Lambda i Cloud.
  • Utwórz punkt końcowy interfejsu API za pomocą bramy Lambda i API i użyj go w kodzie

Przykład w NodeJS:

  • Utwórz i uporządkuj regiony (punkty końcowe). [można też użyć AWS opisRegions () ]
var regionNames = ['us-west-1', 'us-west-2', 'us-east-1', 'eu-west-1', 'eu-central-1', 'sa-east-1 ',' ap-południowy-wschód-1 ',' ap-południowy-wschód-2 ',' ap-północno-wschodni-1 ',' ap-północny-wschód-2 '];

    regionNames.forEach (function (region) {
        getInstances (region);
    });

  • Następnie w getInstancesfunkcji DescribeInstances()można wywołać.
function getInstances (region) {
            EC2.describeInstances (params, function (err, data) {
                if (err) return console.log ("Błąd połączenia z AWS, nie znaleziono takiej instancji!");
                data.Reservations.forEach (function (rezerwacja) {
                // wykonaj dowolną zamierzoną operację
      });
    }

Poza kursem, nie krępuj się używać wersji ES6 i nowszych.

Napisałem funkcję lambda, aby uzyskać wszystkie instancje w dowolnym stanie [uruchomione, zatrzymane] iz dowolnego regionu, poda również szczegóły dotyczące typu instancji i różnych innych parametrów.

Skrypt działa we wszystkich regionach i wywołaniach AWS DescribeInstances(), aby uzyskać instancje.

Musisz tylko utworzyć funkcję lambda w czasie wykonywania nodejs. Możesz nawet stworzyć z niego API i używać go w razie potrzeby.

Ponadto możesz zobaczyć oficjalne dokumenty AWS do opisu informacji, aby poznać wiele innych opcji.

J. Parashar
źródło
1

Stworzyłem skrypt typu open source, który pomoże Ci wyświetlić listę wszystkich instancji AWS. https://github.com/Appnroll/aws-ec2-instances

Jest to część skryptu, która zawiera listę instancji dla jednego profilu rejestrującego je w bazie danych PostgreSQL z wykorzystaniem jqdo analizy json:

DATABASE="aws_instances"
TABLE_NAME="aws_ec2"
SAVED_FIELDS="state, name, type, instance_id, public_ip, launch_time, region, profile, publicdnsname"
# collects the regions to display them in the end of script
REGIONS_WITH_INSTANCES=""

for region in `aws ec2 describe-regions --output text | cut -f3`
do
   # this mappping depends on describe-instances command output
   INSTANCE_ATTRIBUTES="{
        state: .State.Name,
        name: .KeyName, type: .InstanceType,
        instance_id: .InstanceId,
        public_ip: .NetworkInterfaces[0].Association.PublicIp,
        launch_time: .LaunchTime,
        \"region\": \"$region\",
        \"profile\": \"$AWS_PROFILE\",
        publicdnsname: .PublicDnsName
   }"

   echo -e "\nListing AWS EC2 Instances in region:'$region'..."
   JSON=".Reservations[] | ( .Instances[] | $INSTANCE_ATTRIBUTES)"
   INSTANCE_JSON=$(aws ec2 describe-instances --region $region)

   if echo $INSTANCE_JSON | jq empty; then
      # "Parsed JSON successfully and got something other than false/null"
      OUT="$(echo $INSTANCE_JSON | jq $JSON)"

      # check if empty
      if [[ ! -z "$OUT" ]] then
        for row in $(echo "${OUT}" | jq -c "." ); do
          psql -c "INSERT INTO $TABLE_NAME($SAVED_FIELDS) SELECT $SAVED_FIELDS from json_populate_record(NULL::$TABLE_NAME, '${row}') ON CONFLICT (instance_id)
            DO UPDATE
            SET state = EXCLUDED.state,
            name = EXCLUDED.name,
            type = EXCLUDED.type,
            launch_time = EXCLUDED.launch_time,
            public_ip = EXCLUDED.public_ip,
            profile = EXCLUDED.profile,
            region = EXCLUDED.region,
            publicdnsname = EXCLUDED.publicdnsname
            " -d $DATABASE
        done

        REGIONS_WITH_INSTANCES+="\n$region"
      else
        echo "No instances"
      fi
   else
        echo "Failed to parse JSON, or got false/null"
   fi
done
tuhaj
źródło
1

Mój skrypt poniżej, oparty na różnych wskazówkach z tego postu i innych. Skrypt jest łatwiejszy do zrozumienia (przynajmniej dla mnie) niż długie wiersze poleceń.

Skrypt zakłada, że ​​profile poświadczeń są przechowywane w pliku ~/.aws/credentialswyglądającym mniej więcej tak:

[default]
aws_access_key_id = foobar
aws_secret_access_key = foobar

[work]
aws_access_key_id = foobar
aws_secret_access_key = foobar

Scenariusz:

#!/usr/bin/env bash

#------------------------------------#
# Script to display AWS EC2 machines #
#------------------------------------#

# NOTES:
# o Requires 'awscli' tools (for ex. on MacOS: $ brew install awscli)
# o AWS output is tabbed - we convert to spaces via 'column' command


#~~~~~~~~~~~~~~~~~~~~#
# Assemble variables #
#~~~~~~~~~~~~~~~~~~~~#

regions=$(aws ec2 describe-regions --output text | cut -f4 | sort)

query_mach='Reservations[].Instances[]'
query_flds='PrivateIpAddress,InstanceId,InstanceType'
query_tags='Tags[?Key==`Name`].Value[]'
query_full="$query_mach.[$query_flds,$query_tags]"


#~~~~~~~~~~~~~~~~~~~~~~~~#
# Output AWS information #
#~~~~~~~~~~~~~~~~~~~~~~~~#

# Iterate through credentials profiles
for profile in 'default' 'work'; do

    # Print profile header
    echo -e "\n"
    echo -e "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
    echo -e "Credentials profile:'$profile'..."
    echo -e "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"

    # Iterate through all regions
    for region in $regions; do

        # Print region header
        echo -e "\n"
        echo -e "Region: $region..."
        echo -e "--------------------------------------------------------------"

        # Output items for the region
        aws ec2 describe-instances    \
          --profile $profile          \
          --region  $region           \
          --query   $query_full       \
          --output  text              \
          | sed     's/None$/None\n/' \
          | sed     '$!N;s/\n/ /'     \
          | column  -t -s $'\t'

    done
done
Eduard Rozenberg
źródło
1
Jeśli jeszcze tego nie zrobiłeś, sugeruję unieważnienie tych poświadczeń.
Thiago
@Thiago dzięki, ale te referencje i tak były fałszywymi symbolami zastępczymi :).
Eduard Rozenberg
1

Aby uruchamiać zadania równolegle i używać wielu profili, użyj tego skryptu.

#! / bin / bash
dla i w profilu 1 profil 2
robić
    OWNER_ID = `aws iam get-user --profile $ i --output text | awk -F ':' '{print $ 5}' ``
    tput setaf 2; echo "Profil: $ i"; tput sgr0
    tput setaf 2; echo "ID właściciela: $ OWNER_ID"; tput sgr0
    dla regionu w `aws --profile $ i ec2 opisz-regiony --output text | wytnij -f4`
    robić
        tput setaf 1; echo "Lista instancji w regionie $ region"; tput sgr0
        aws ec2 description-instances --query 'Reservations [*]. Instances [*]. [Tags [? Key ==' Name`] .Value, InstanceId] '--profile $ i --region $ region --output text
    Gotowe &
Gotowe
czekać

Zrzut ekranu:

zrzut ekranu

Akhil Jalagam
źródło
0

Na podstawie kodu @hansaplast stworzyłem wersję przyjazną dla systemu Windows, która obsługuje wiele profili jako argument. Po prostu zapisz ten plik jako plik cmd lub bat. Musisz też mieć jqrozkaz.

@echo off 
setlocal enableDelayedExpansion

set PROFILE=%1
IF "%1"=="" (SET PROFILE=default)

echo checkin instances in all regions for %PROFILE% account
FOR /F "tokens=* USEBACKQ" %%F IN (`aws ec2 describe-regions --query Regions[*].[RegionName] --output text --profile %PROFILE%`) DO (
echo === region: %%F
aws ec2 describe-instances --region %%F --profile %PROFILE%| jq ".Reservations[].Instances[] | {type: .InstanceType, state: .State.Name, tags: .Tags, zone: .Placement.AvailabilityZone}"
)
Paweł
źródło
0

Możesz skorzystać z narzędzia CLI przeznaczonego do wyliczania zasobów w chmurze (skanowanie między regionami i kontami) - https://github.com/scopely-devops/skew

Po krótkiej konfiguracji możesz użyć następującego kodu, aby wyświetlić listę wszystkich instancji we wszystkich regionach US AWS (zakładając, że 123456789012 to numer Twojego konta AWS).

from skew import scan

arn = scan('arn:aws:ec2:us-*:123456789012:instance/*')
for resource in arn:
    print(resource.data)
Dmytro
źródło
0

Dobre narzędzie do zasobów CRUD AWS . Znajdź [EC2 | RDS | IAM ..] we wszystkich regionach. Na wynikach filtrów można wykonywać operacje (stop | run | terminate).

python3 awsconsole.py ec2 all // return list of all instances
python3 awsconsole.py ec2 all -r eu-west-1
python3 awsconsole.py ec2 find -i i-0552e09b7a54fa2cf --[terminate|start|stop]
Rafał
źródło