Как бы вы описали список экземпляров, используя aws cli в определенном VPC с именем тега, частным IP-адресом экземпляра и идентификатором экземпляра?

19

Самое близкое, что у меня есть, это использование следующих команд.

Эта команда управляет списком всех имен экземпляров.

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value[]'

Эта команда выводит список всех приватных IP-адресов, идентификаторов экземпляров и ВСЕХ тегов, которые мне не нужны. Мне просто нужно имя.

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b | jq '.Reservations[].Instances[] | {PrivateIpAddress, InstanceId, Tags}'

Я не уверен, почему я не могу выполнить команду следующим образом:

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags[?Key==`Name`].Value[]'

Эта команда работает, но показывает все имена ключей тегов.

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags'
Imagineer
источник
1
Вы просто копируете эти команды откуда-то, не пытаясь понять, что они делают?
Майкл Хэмптон
Не совсем, я пытался понять, как использовать jq и как получить базовый вывод json, который я хочу. Однако я не смог найти примеров того, чего я пытаюсь достичь. Использование «Тегов [? Key == Name] .Value []» в качестве фильтра для вывода значения имени ключа возможно только после aws-cli v1.3.0. И я использую комбинацию --filter и jq, чтобы получить желаемый вывод. Ближайшей командой является aws ec2 description-instances --filters Name = vpc-id, Values ​​= vpc-e2f17e8b | jq '.Reservations []. Экземпляры [] | {PrivateIpAddress, InstanceId, Tags} 'Мне просто нужно знать, как ссылаться на тег Key Key = Name с помощью jq.
Imagineer

Ответы:

24

Вам необходимо избежать обратной косой черты, чтобы правильно отформатировать ответ.

aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'

Так что это фактическая команда, которую вы хотите:

$ aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-ac973bc9 --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'
10.101.255.10   i-91efd39b Server1
10.101.255.9    i-f1e8d4fb Server2

И тебе не нужно .Value[]. Вы можете просто использовать .Value, и это даст тот же результат.

Это потрясающе, кстати. Я буду реализовывать это сам!

ИСПРАВЛЕНИЕ: Выше не будет работать, если значение .Value«Нет». Это работает лучше:

$ aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-ac973bc9 --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed 's/None$/None\n/' | sed '$!N;s/\n/ /'
10.101.255.10   i-91efd39b Server1
10.101.255.9    i-f1e8d4fb Server2
10.101.255.8    i-f6c2450a      None
10.101.255.7    i-34a6afce Server3
DrStrangepork
источник
Можете ли вы объяснить свою команду sed? Я получаю идентификаторы / имена экземпляров по одному, возможно, потому, что я не понимаю косвенное расширение оболочки в sed.
Йорфус
3
Если экземпляр не Именован (не установлен Tag: key = Name), следующий экземпляр печатается в той же строке. Первая команда sed печатает строку «None \ n», чтобы смягчить эту проблему. Вторая команда sed удаляет перевод строки с id экземпляра, так что строка Tag: key = Name выводится в той же строке.
DrStrangepork
8

Попробуй это

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value|[0],State.Name,PrivateIpAddress,PublicIpAddress]' --output text | column -t
Укороченный человек
источник
3
Вы должны включить объяснение для вашего кода. Описание того, как и почему этот код решает проблему, более полезно, поскольку помогает ОП и другим читателям решить эту и подобные проблемы самостоятельно.
Энтони Дж. - правосудие для Моники
Это работает, но действительно, почему это работает? |это какой-то фильтр?
аирей
7

Приведенные выше ответы в порядке, но мой фаворит такой же;

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,PrivateIpAddress,PublicIpAddress,Tags[?Key==`Name`].Value[]]' --output json | tr -d '\n[] "' | perl -pe 's/i-/\ni-/g' | tr ',' '\t' | sed -e 's/null/None/g' | grep '^i-' | column -t

фактически его можно поместить в список функций BASH;

awsls () { aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,PrivateIpAddress,PublicIpAddress,Tags[?Key==`Name`].Value[]]' --output json | tr -d '\n[] "' | perl -pe 's/i-/\ni-/g' | tr ',' '\t' | sed -e 's/null/None/g' | grep '^i-' | column -t }

затем просто позвоните из командной строки как «awsls»

Хорхе де ла Торре
источник
Как добавить несколько функций в один файл и просто вызвать нужную функцию?
Страйкер
2

Что-то вроде этого?

aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'
Алан
источник
1

Я добавил фильтр, например, состояние «работает». Размещение здесь на случай, если это будет полезно для всех.

Мой вариант использования немного отличается, я генерирую файлы хоста Ansible, поэтому я просто хочу, чтобы частный IP # имя был на всех запущенных хостах.

aws ec2 describe-instances --profile=$PROFILE --filters Name=vpc-id,Values=$VPCID Name=instance-state-name,Values=running --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed 's/None$/None\n/' | sed '$!N;s/\n/ /' | awk '{print $1 " #" $2 }'
jorfus
источник
0

Добавление это для людей, которые найдут этот пост при поиске, как получить информацию вашего экземпляра. Вы также можете добавить VPC в оператор выбора, чтобы получить его.

В powershell вы можете использовать:

(Get-EC2Instance -ProfileName Profile).Instances | select InstanceId,PrivateIPAddress,PublicIpAddress @{Name="Servername";Expression={$_.tags | where key -eq "Name" | select Value -expand Value}} | Format-Table.

С AWS CLI вы можете использовать:

aws ec2 describe-instances --region=us-east-1 --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==Name].Value|[0],PrivateIpAddress,PublicIpAddress]' --output text --profile ProfileName
Хосе Адамс
источник
Я отредактировал ваш ответ, чтобы отформатировать команды как команды / код. Не могли бы вы еще раз проверить, что период в конце вашей первой команды должен быть там? Если нет, пожалуйста, отредактируйте его, спасибо
JimLohse