Как увидеть все запущенные инстансы Amazon EC2 во всех регионах?


113

Я часто переключаю экземпляры между разными регионами и иногда забываю выключить свой запущенный экземпляр из другого региона. Я не мог найти способ увидеть все запущенные экземпляры на консоли Amazon.
Есть ли способ отобразить все запущенные экземпляры независимо от региона?


48
Тот факт, что графический интерфейс AWS не позволяет вам просто перечислить все экземпляры, действительно глуп.
Дэн Даскалеску

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

3
@DanDascalescu ты уверен? Как вы думаете, сколько денег AWS заработала на таких людях, как OP, которые забыли выключить работающий инстанс?
smartcaveman

2
@DanDascalescu, как умный пещерный человек, говорит, что совсем не глупо, если экземпляры разбросаны по всем регионам и о них забудут, пока тикер $ тикер тикает для Безоса.
Эдуард Розенберг

2
@DanDascalescu, как бы они взимали плату с людей за то, что они забывают экземпляры, если бы они просто показали, что работает ...?
EralpB 04

Ответы:


125

Неочевидный вариант графического интерфейса Resource Groups > Tag Editor. Здесь вы можете найти все экземпляры во всех регионах, даже если экземпляры не были помечены. Снимок экрана


РЕДАКТИРОВАТЬ: этот экран был недавно переработан и теперь имеет новый внешний вид и опцию «Все регионы».


2
Спасибо, отличный хак!
Роб Макдональд

1
Это снова изменилось. Я больше не вижу в этом инструменте блок «Регионы». Вместо этого он просто показывает все в «Текущем регионе». Одному Богу известно, где это происходит ... Меня изрядно тошнит от этих идиотов, если у меня есть штат из двадцати и 500 машин.
точка останова

1
@breakpoint похоже, что теперь они добавили ссылку на предыдущий редактор тегов, который поддерживает поиск в нескольких регионах.
Heinrich Filter

1
Человек, это спасатель! Спасибо, что поделился! :-D
Лоуренс

1
Было бы здорово, если бы у aws был встроенный выпадающий список для «всех регионов» или что-то подобное
Стивек

62

Я не думаю, что в настоящее время вы можете сделать это в графическом интерфейсе AWS. Но вот способ составить список всех ваших экземпляров во всех регионах с помощью интерфейса командной строки 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

Взято отсюда (если вы хотите увидеть полное обсуждение)

Кроме того, если вы получаете

Вы должны указать регион. Вы также можете настроить свой регион, запустив «aws configure».

Вы можете сделать это aws configure set region us-east-1, спасибо @Sabuncu за комментарий.

Обновить

Теперь (в 2019 году) команду вырезать нужно применить к 4-му полю: cut -f4


13
Чтобы избежать cut, вы можете использовать:aws ec2 describe-regions --query Regions[*].[RegionName] --output text
stefansundin

При использовании профилей добавьте --profile имя-профиля к обеим командам aws ec2.
Carlton

Вы можете использовать эту команду в Windows 10 CMD, FOR /F %G IN ('aws ec2 describe-regions --query Regions[*].[RegionName] --output text') DO (aws ec2 describe-instances --region %G)
Манджула,

Сейчас это, похоже, не работает - 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

Обновили снова. Теперь на панели управления 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. Это set +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 Watch.
  • Создайте конечную точку api с помощью Lambda и шлюза api и используйте ее в своем коде

Пример в NodeJS:

  • Создание массива регионов (конечных точек). [также можно использовать AWS describeRegions () ]
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 (функция (регион) {
        getInstances (регион);
    });

  • Затем в getInstancesфункции DescribeInstances()можно вызвать.
function getInstances (регион) {
            EC2.describeInstances (params, function (err, data) {
                if (err) return console.log («Ошибка подключения к AWS, такой экземпляр не найден!»);
                data.Reservations.forEach (функция (резервирование) {
                // выполняем любую предполагаемую операцию
      });
    }

И, конечно же, смело используйте ES6 и выше.

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

Скрипт запускается во всех регионах и вызовах AWS DescribeInstances()для получения экземпляров.

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

Кроме того, вы можете просмотреть официальную документацию AWS для DescribeInstances, чтобы изучить многие другие варианты.


1

Я создал сценарий с открытым исходным кодом, который поможет вам составить список всех экземпляров AWS. https://github.com/Appnroll/aws-ec2-instances

Это часть скрипта, в котором перечислены экземпляры для одного профиля, записывающие их в базу данных 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

@Thiago, спасибо, но эти учетные данные все равно были фиктивными заполнителями :).
Эдуард Розенберг

1

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

#! / bin / bash
для i в profile1 profile2
делать
    OWNER_ID = `aws iam get-user --profile $ i --output text | awk -F ':' '{напечатать $ 5}' '
    tput setaf 2; echo "Профиль: $ i"; tput sgr0
    tput setaf 2; echo "OwnerID: $ OWNER_ID"; tput sgr0
    для региона в `aws --profile $ i ec2 Descripción-region --output text | вырезать -f4`
    делать
        tput setaf 1; echo «Список экземпляров в регионе $ region»; tput sgr0
        aws ec2 describe-instance --query 'Reservations [*]. Instances [*]. [Tags [? Key == `Name`] .Value, InstanceId]' --profile $ i --region $ region --output text
    сделано &
сделано
Подождите

Скриншот:

Скриншот


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.