Aws-cli: Как описать экземпляры из всех регионов?

Созданный на 8 февр. 2016  ·  17Комментарии  ·  Источник: aws/aws-cli

Я пытаюсь переключить свой рабочий процесс на cli из панели управления aws, но столкнулся с очень странной проблемой. Я знаю, как описать экземпляры в пределах региона, но как мне описать все мои экземпляры независимо от регионов? Или, по крайней мере, получить вывод всех регионов ec2, чтобы я мог делать это программно один за другим (например, что-то вроде aws ec2 list-regions ).

Это очень странно, потому что CLI использует другие имена для регионов, чем панель управления. Во-первых, очевидно, что все мои экземпляры запускаются в регионе «us-west-2» (по крайней мере, пока), но я не могу найти эту строку нигде в панели управления. На самом деле, я вообще не могу найти где-нибудь список моего региона по умолчанию.

Есть ли команда внутри aws, которая делает это?

Самый полезный комментарий

Для людей, прибывающих сюда из Google, вот один из способов перечислить все ваши экземпляры во всех регионах с помощью интерфейса командной строки AWS (на основе обсуждения выше):

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

Все 17 Комментарий

Консоль не позволяет перечислить все экземпляры независимо от региона, но скрывает идентификаторы регионов с более описательным текстом. Например, us-west-2 — это центр обработки данных, расположенный в Орегоне. В правом верхнем углу страницы консоли есть раскрывающийся список, который позволяет выбрать регион (на фото ниже).

Для большинства служб в настоящее время не существует программного способа определения доступных регионов, поэтому вам потребуется обратиться к этому списку . Однако EC2 является одним из исключений, поскольку он предоставляет функцию describe-regions . Поскольку интерфейс командной строки является оболочкой над API службы, мы не можем выполнять поиск в нескольких регионах, если служба не поддерживает его (например, S3 в основном не зависит от региона). Вам нужно будет предоставить региону аргумент --region для запроса в другом регионе.

Ваш регион по умолчанию находится в файле конфигурации ( ~/.aws/config в системах UNIX), и его можно как показать, так и установить с помощью команды aws configure .

regions

Для людей, прибывающих сюда из Google, вот один из способов перечислить все ваши экземпляры во всех регионах с помощью интерфейса командной строки AWS (на основе обсуждения выше):

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

Для тех из вас, кто также не хочет анализировать JSON своими глазами, вот добавленная версия, в которой используется jq, чтобы дать вам более конкретную сводку.

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

Пример вывода:

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

@небытие Красиво ! Если вы часто используете это, вам следует подумать о том, чтобы сделать его псевдонимом .

Другой вариант — использовать модуль AWS PowerShell .NET Core, который изначально работает в Linux, Mac и Windows.

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

Вывод с использованием таблицы форматов

По умолчанию в текущей версии модуля AWS PowerShell экземпляры EC2 возвращаются в формате PowerShell «список». Однако это легко изменить на табличное форматирование с помощью команды Format-Table .

$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}

Вы можете использовать jq , если хотите добавить больше зависимостей, или просто использовать встроенный --query в CLI AWS:
aws --profile whatever ec2 describe-instances --query 'Reservations[].Instances[].[State.Name,InstanceType]' [ [ "running", "t2.small" ], [ "running", "t2.small" ], [ "running", "m3.medium" ] ]

при чтении -rr ; область начала эха: $r; делать во время чтения -ri ; сделать эхо-идентификатор экземпляра: $i 2>&1 ; done < <(aws ec2 description-instances --query "Reservations[].Instances[].InstanceId" --region $r --profile prd|perl -nl -e 's/\s+/\n/g;print '); echo "область остановки: $r" ; done < <(aws ec2 description-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

Просто еще одно решение, которое я только что написал!
Этот небольшой скрипт может выполнять команды во всех регионах.
Примеры использования:
sudo ./aws-x.sh ec2 описать экземпляры
sudo ./aws-x.sh ec2 описать экземпляры | grep PrivateDnsName

!/бин/баш

echo "Получение доступных регионов AWS:"
sudo aws ec2 description-regions --region eu-west-2 |grep RegionName |cut -d '"' -f 4 > /tmp/regions.txt
кошка /tmp/regions.txt

Начать выполнение

во время чтения региона; делать
echo "Выполнение " $@ " в " $region ":"
aws --регион $регион $@
Выполнено

уборка

рм /tmp/regions.txt

!/бин/баш

echo Захват экземпляров во всех регионах, пожалуйста, подождите..
для региона в aws ec2 describe-regions --output text | cut -f3
делать
aws ec2 description-instances --region $region --query 'Reservations[].Instances[].[State.Name,InstanceType,PublicIpAddress,Placement.AvailabilityZone]' --output text
Выполнено

------вывод-------

./get-instances.sh

Захват инстансов во всех регионах, пожалуйста, подождите..

работает t2.micro 54.93.120.174 eu-central-1b

работает t2.micro 54.86.91.202 us-east-1d

Для тех из вас, кто также не хочет анализировать JSON своими глазами, вот добавленная версия, в которой используется jq, чтобы дать вам более конкретную сводку.

aws cli поддерживает параметр «query» , который делает это как встроенный.

Спасибо обижан! Я начал использовать jq несколько месяцев назад, и это изменило мою жизнь :)

Обратите внимание, что AWS Cli Docs по- прежнему рекомендует JQ для более продвинутого использования:

Если вам нужны более продвинутые функции, которые могут быть недоступны с --query, вы можете проверить jq, процессор командной строки JSON. Вы можете скачать его и найти официальное руководство по адресу http://stedolan.github.io/jq/.

ИМХО, --query все еще стоит посмотреть, работает ли он для вашего варианта использования запроса, поскольку он изначально поддерживается интерфейсом командной строки AWS. Эта опция была добавлена ​​в aws cli версии 1.2.0, которая была выпущена 18 октября 2013 г. , поэтому у вас обязательно должна быть эта опция, если у вас не

Если вы предпочитаете использовать параметр --query , обратите внимание, что он использует JMESPath в качестве языка запросов (на домашней странице есть работающий тестер JMESPath). Учебник также заслуживает внимания.


Пример сравнения аналогичного запроса

Следующие запросы перечисляют экземпляры RDS в регионе по умолчанию с помощью aws cli, анализируя вывод json из него с помощью JQ и JMESPath.

Например, аналогичный запрос кажется гораздо более читабельным OOTB в JMESPath:

# 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
        ]
    ]
]

Если opt-in-not-required является третьим столбцом вывода при запуске aws ec2 describe-regions --output text , вы можете изменить cut -f3 на cut -f4 следующим образом:

for region in `aws ec2 describe-regions --output text | cut -f4`
do

done

Вероятно, более надежным способом является использование запроса JMESPath следующим образом:

for region in $(aws ec2 describe-regions --query "Regions[*].RegionName" --output text)
do

done

Вы также можете выполнить дальнейший анализ, чтобы отфильтровать нужные регионы с помощью grep .
Например, после установки awscli-aliases добавьте следующее в ~/.aws/cli/alias чтобы получить список своих экземпляров:

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

Использование:

$ aws list-instances

Примените фильтр к коду региона, например, us для регионов США:

$ aws list-instances 'us'

для региона в aws ec2 describe-regions --output text | cut -f3
делать
echo -e "\nСписок экземпляров в регионе:'$region'..."
aws ec2 описания экземпляров --region $region | grep работает > файл.txt
файл кота.txt | туалет -л
Выполнено

image

Была ли эта страница полезной?
0 / 5 - 0 рейтинги