Я пытаюсь переключить свой рабочий процесс на cli из панели управления aws, но столкнулся с очень странной проблемой. Я знаю, как описать экземпляры в пределах региона, но как мне описать все мои экземпляры независимо от регионов? Или, по крайней мере, получить вывод всех регионов ec2, чтобы я мог делать это программно один за другим (например, что-то вроде aws ec2 list-regions
).
Это очень странно, потому что CLI использует другие имена для регионов, чем панель управления. Во-первых, очевидно, что все мои экземпляры запускаются в регионе «us-west-2» (по крайней мере, пока), но я не могу найти эту строку нигде в панели управления. На самом деле, я вообще не могу найти где-нибудь список моего региона по умолчанию.
Есть ли команда внутри aws, которая делает это?
Консоль не позволяет перечислить все экземпляры независимо от региона, но скрывает идентификаторы регионов с более описательным текстом. Например, us-west-2
— это центр обработки данных, расположенный в Орегоне. В правом верхнем углу страницы консоли есть раскрывающийся список, который позволяет выбрать регион (на фото ниже).
Для большинства служб в настоящее время не существует программного способа определения доступных регионов, поэтому вам потребуется обратиться к этому списку . Однако EC2 является одним из исключений, поскольку он предоставляет функцию describe-regions
. Поскольку интерфейс командной строки является оболочкой над API службы, мы не можем выполнять поиск в нескольких регионах, если служба не поддерживает его (например, S3 в основном не зависит от региона). Вам нужно будет предоставить региону аргумент --region
для запроса в другом регионе.
Ваш регион по умолчанию находится в файле конфигурации ( ~/.aws/config
в системах UNIX), и его можно как показать, так и установить с помощью команды aws configure
.
Для людей, прибывающих сюда из 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
Выполнено
Для тех из вас, кто также не хочет анализировать 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 | туалет -л
Выполнено
Самый полезный комментарий
Для людей, прибывающих сюда из Google, вот один из способов перечислить все ваши экземпляры во всех регионах с помощью интерфейса командной строки AWS (на основе обсуждения выше):