Як побачити всі запущені екземпляри Amazon EC2 у всіх регіонах?


112

Я часто перемикаю випадки між різними регіонами, а іноді забуваю вимкнути свій запущений екземпляр з іншого регіону. Я не міг знайти жодного способу побачити всі запущені екземпляри на консолі Amazon.
Чи є спосіб відобразити всі запущені екземпляри незалежно від регіону?


47
Те, що графічний інтерфейс AWS не просто дозволяє вам перераховувати всі екземпляри, насправді є дуже німим.
Дан Даскалеску

4
Не ідеально і, безумовно, не очевидно, але ви можете використовувати Resource Groups > Tag Editorяк графічний інтерфейс. Дивіться мою відповідь нижче.
Генріх Фільтр

3
@DanDascalescu ви впевнені? Як ви думаєте, скільки грошей заробив AWS від таких людей, як ОП, які забули вимкнути запущений екземпляр?
smartcaveman

2
@DanDascalescu, як smartcaveman, каже, що це нітрохи не глупо, якщо екземпляри розкидаються по багатьох регіонах і про них забули, в той час як галочки $ галочки галочки для Bezos.
Едуард Розенберг

2
@DanDascalescu як би вони звинуватили людей за забуття примірників, якби вони просто показали, що працює ..?
EralpB

Відповіді:


122

Неочевидний варіант GUI є Resource Groups > Tag Editor. Тут ви можете знайти всі екземпляри в усіх регіонах, навіть якщо екземпляри не позначені тегами. Захоплення екрану


РЕДАКТУВАННЯ: Цей екран був нещодавно перероблений і тепер має новий вигляд та опцію "Усі регіони".


2
Дякую, чудовий хак!
Роб Макдональд

1
Це знову змінилося. Я більше не бачу в цьому інструменті блок "регіони". Натомість він просто показує все в "Поточному регіоні". Бог тільки знає, де це встановити ... Мені стає дуже нудно від цих ідіотів, припускаючи, що у мене є штат з двадцяти і 500 машин.
точка розриву

1
@breakpoint виглядає так, що тепер вони додали посилання на попередній редактор тегів, який підтримує пошук у кількох регіонах.
Фільтр Генріха

1
Людина, це рятівник життя! Дякую, що поділились! :-D
Лоуренс

1
Було б чудово , якби AWS був побудований в Опуститеся на «усі регіони» або аналогічний
stevec

62

Я не думаю, що ви зараз можете це зробити в графічному інтерфейсі AWS. Але ось спосіб перерахувати всі ваші примірники в усіх регіонах за допомогою AWS CLI:

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

Взято звідси (Якщо ви хочете побачити повну дискусію)

Крім того, якщо ви отримуєте

Ви повинні вказати регіон. Ви також можете налаштувати свій регіон, запустивши "aws configure"

Ви можете це зробити aws configure set region us-east-1, дякую @Sabuncu за коментар.

Оновлення

Тепер (у 2019 році) команда cut має бути застосована до 4-го поля: cut -f4


13
Щоб уникнути cut, ви можете використовувати:aws ec2 describe-regions --query Regions[*].[RegionName] --output text
stefansundin

Якщо ви використовуєте профілі, додайте --profile profile-name до обох команд aws ec2.
Карлтон

Цю команду можна використовувати в Windows 10 CMD, FOR /F %G IN ('aws ec2 describe-regions --query Regions[*].[RegionName] --output text') DO (aws ec2 describe-instances --region %G)
Manjula

Це, здається, не працює зараз - You must specify a region. You can also configure your region by running "aws configure".- здається, що вказати регіон - це протилежне тому, що я хочу зробити
Буде Шеппард

@WillSheppard Спочатку потрібно налаштувати свій регіон; напрaws configure set region us-east-1 . Тоді, коли ти біжиш aws ec2 describe-regions, у тебе не повинно виникнути проблем. Будь ласка, дивіться відповідь: stackoverflow.com/a/46577479/360840 , а також інші відповіді під відповідним запитанням.
Sabuncu

19

Рішення @imTachu працює добре. Для цього за допомогою консолі AWS ...

  • Консоль AWS
  • Послуги
  • Мережа та доставка контенту
  • VPC
  • Шукайте блок під назвою "Запуск екземплярів", це покаже вам поточний регіон
  • Натисніть посилання "Переглянути всі регіони" під ним

Зараз у розділі "Послуги" немає "Мереж та доставки контенту"
Буде Шеппард

2
в консолі AWS: натисніть "Services"> у текстовому полі "vpc" та виберіть хмарні ресурси, виділені VPC
nir weiner

чудово працює @Carlton дякую
NuoYi

Вони оновили її знову. Зараз на панелі приладів EC2 є ярлик. Перейдіть до розділу з екземплярами та натисніть "екземпляри". Він покаже всі запущені екземпляри у вибраному регіоні.
Mindfulgeek

17
  1. Спочатку перейдіть до консолі управління AWS і натисніть на Група ресурсів:

    введіть тут опис зображення

  2. Потім знайдіть Network and Content Deliveryі натисніть на VPC:

    введіть тут опис зображення

  3. Потім знайдіть Запуск екземплярів і розгорніть, побачити всі регіони. Тут ви можете знайти всі запущені екземпляри з усіх регіонів:

    введіть тут опис зображення


13

У консолі

Перейдіть на інформаційну панель VPC https://console.aws.amazon.com/vpc/homeта натисніть Running instances-> See all regions.

введіть тут опис зображення

У CLI

Додайте це для прикладу .bashrc. Перезавантажте його source ~/.bashrcта запустіть

Примітка: За винятком CLI AWS вам потрібно мати 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
}

Приклад виводу:

$ 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'..

8

Кожен раз, коли ви створюєте ресурс, позначте його ім'ям, і тепер ви можете використовувати Групи ресурсів для пошуку всіх типів ресурсів із тегом імен у всіх регіонах.


Якщо вам набридло
тегувати

7

На основі відповіді imTachus, але менш багатослівної, плюс швидшої. Потрібно встановити jq та 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

Сценарій працює aws ec2 describe-instancesпаралельно для кожної області (зараз 15!) І вилучає лише відповідні біти (стан, теги, зона наявності) з виводу json. Theset +mПотрібно тому фонові процеси не повідомляють при запуску / закінчення.

Приклад виводу:

{
  "type": "t2.micro",
  "state": "stopped",
  "tags": [
    {
      "Key": "Name",
      "Value": "MyEc2WebServer"
    },
  ],
  "zone": "eu-central-1b"
}

4

Прочитавши всі рішення та спробувавши купу матеріалів, той, який працював на мене, був:

  1. Елемент списку
  2. Перейдіть до групи ресурсів
  3. Редактор тегів
  4. Виберіть Усі регіони
  5. Виберіть Екземпляр EC2 у тип ресурсу
  6. Клацніть Ресурси пошуку

Знімок рішення


3

Ви можете бігати DescribeInstances()по всіх регіонах.

Крім того, ви можете:

  • Автоматизуйте його через годинник Lambda та Cloud.
  • Створіть кінцеву точку api за допомогою шлюзу Lambda та api та використовуйте його у своєму коді

Зразок у NodeJS:

  • Створення та масив регіонів (кінцевих точок). [також можна використовувати AWS descriptionRegions () ]
var regionNames = ['us-west-1', 'us-west-2', 'us-east-1', 'eu-west-1', 'eu-central-1', 'sa-east-1 ',' ап-південно-схід-1 ',' ап-південно-схід-2 ',' ап-північний схід-1 ',' ап-північний схід-2 '];

    regionNames.forEach (функція (регіон) {
        getInsances (регіон);
    });

  • Тоді за getInstancesфункцією DescribeInstances()можна викликати.
функція getInsances (регіон) {
            EC2.describeInsances (парами, функція (помилка, дані) {
                if (помилка) return console.log ("Помилка підключення до AWS. Такого інстанції не знайдено!");
                data.Reservation.forEach (функція (бронювання) {
                // робити будь-яку призначену операцію
      });
    }

І поза курсом, не соромтеся використовувати ES6 та вище.

Я написав лямбда-функцію, щоб отримати всі екземпляри в будь-якому стані [запущений, зупинений] і з будь-яких регіонів, також дам детальну інформацію про тип екземпляра та різні інші параметри.

Сценарій працює у всіх регіонах AWS та телефонує DescribeInstances(), щоб отримати екземпляри.

Вам просто потрібно створити лямбда-функцію з часом виконання nodejs. Ви навіть можете створити з нього API і використовувати його як і коли потрібно.

Крім того, ви можете ознайомитись з офіційними документами AWS Docs For DescribeInsances, щоб ознайомитися з багатьма іншими варіантами.


1

Я створив сценарій з відкритим кодом, який допомагає вам перелічити всі екземпляри AWS. https://github.com/Appnroll/aws-ec2-речовини

Це частина сценарію, в якій перераховані екземпляри одного профілю, який записує їх у базу даних postgreSQL з використанням jqдля розбору 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

1

Мій сценарій нижче, заснований на різних порадах з цієї публікації та інших місць. Сценарій легше дотримуватися (як мінімум для мене), ніж довгі командні рядки.

Сценарій передбачає, що профілі облікових даних зберігаються у файлі, ~/.aws/credentialsвиглядаючи як:

[default]
aws_access_key_id = foobar
aws_secret_access_key = foobar

[work]
aws_access_key_id = foobar
aws_secret_access_key = foobar

Сценарій:

#!/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

1
Якщо ви цього ще не зробили, я б запропонував вам визнати недійсними ці дані.
Тіаго

@Thiago дякую, але ці повноваження були в будь-якому випадку фіктивними місцями :).
Едуард Розенберг

1

Для паралельного запуску завдань та використання декількох профілів використовуйте цей скрипт.

#! / бін / баш
для я в profile1 profile2
робити
    OWNER_ID = `aws iam get-user --profile $ i - вихідний текст | awk -F ':' '{print $ 5}' `
    tput setaf 2; echo "Профіль: $ i"; tput sgr0
    tput setaf 2; echo "OwnerID: $ OWNER_ID"; tput sgr0
    для регіону в `aws --profile $ i ec2 опису-регіони - вихідний текст | вирізати -f4`
    робити
        tput setaf 1; echo "Перелік екземплярів у регіоні $ region"; tput sgr0
        aws ec2 описує-екземпляри - запит "Резервації [*]. Екземпляри [*]. [Теги [? ключ ==` Ім'я`].
    зробив &
зроблено
чекати

Знімок екрана:

скріншот


0

На основі @hansaplast коду я створив зручну для Windows версію, яка підтримує декілька профілів як аргумент. Просто збережіть цей файл у форматі cmd або bat. Вам також потрібно мати jqкоманду.

@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}"
)

0

Ви можете використовувати інструмент cli, розроблений для перерахування хмарних ресурсів (сканування міжрегіональних та міжплатних облікових записів) - https://github.com/scopely-devops/skew

Після короткої конфігурації ви можете використовувати наступний код для переліку всіх примірників у всіх регіонах AWS США (якщо припустимо, 123456789012 - ваш номер облікового запису AWS).

from skew import scan

arn = scan('arn:aws:ec2:us-*:123456789012:instance/*')
for resource in arn:
    print(resource.data)

0

Хороший інструмент для ресурсів CRUD AWS . Знайдіть [EC2 | RDS | IAM ..] у всіх регіонах. Тут можна робити операції (зупиняти | запускати | припиняти) на результатах фільтру.

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]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.