Поиск всех экземпляров Amazon AWS, которые не имеют определенного тега
Я пытаюсь использовать средства командной строки Amazon AWS для поиска всех экземпляров, у которых нет указанного тега.
Поиск всех экземпляров с тегом достаточно прост, например
ec2-describe-instances --filter "tag-key=Name"
Но как бы инвертировать этот фильтр для возврата только экземпляров, у которых нет тега "Имя"?
Ответы
Ответ 1
Это сделает то, что вы просите, - найдите каждый экземпляр, который не содержит тег с именем "YOUR_KEY_NAME_HERE" (фильтры второй строки для экземпляров без тегов с именем "Имя" ):
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "YOUR_KEY_NAME_HERE"} ]}) | not)'
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"} ]}) | not)'
Если вы хотите отфильтровать значение тега вместо имени тега, в этом запросе перечислены все экземпляры, которые не содержат тег с именем YOUR_KEY_NAME_HERE, значение которого EXCLUDE_ME. (Вторая строка перечисляет экземпляры, которые не называются "testbox1".)
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "YOUR_KEY_NAME_HERE"}, {Value: "EXCLUDE_ME"}]}) | not)'
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"}, {Value: "testbox1"}]}) | not)'
Фелипе верен. Разбор выходных данных - единственный путь, так как AWS API не предоставляет эту функцию и не выполняет никаких официальных AWI CLI. Выход JSON очень разбирается, особенно по сравнению с многострочными текстовыми записями, которые по умолчанию печатает старый CLI.
http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeInstances.html
API сам возвращает JSON, а новый awscli печатает этот JSON как выходной формат по умолчанию. Программа "jq" очень полезна для ее синтаксического анализа и даже раскрашивает при отправке на терминал, или вы можете вывести текст, чтобы уменьшить его до строк.
Ответ 2
Вы можете сделать это с помощью jmespath (движок, который управляет параметром --query
), несмотря на то, что другие говорят:
aws ec2 describe-instances \
--query 'Reservations[].Instances[?!not_null(Tags[?Key == `Name`].Value)] | []'
Ответ 3
К сожалению, основной вызов api DescribeSnapshots не поддерживает фильтрацию обратных тегов, и поэтому CLI не работает. Тем не менее, вы можете фильтровать на стороне клиента с параметром --query
, который выполняет поиск JMESPath. Это не позволит вам использовать трубы, как с ответом пользователя2616321.
Например:
aws ec2 describe-instances --query "Reservations[].Instances[?Tags[?Key == 'Name']][]"
Добавьте .InstanceId
в конец этого, чтобы просто получить идентификаторы экземпляра.
Ответ 4
Поскольку параметр --filters
, похоже, не поддерживает обратную фильтрацию, здесь мое решение этой проблемы с использованием параметра --query
:
aws ec2 describe-instances \
--query 'Reservations[].Instances[?!contains(Tags[].Key, `Name`)][].InstanceId'
Он просматривает массив ключей тегов для каждого экземпляра и фильтрует те экземпляры, у которых нет тега 'Name' в массиве. Затем выравнивает вывод массива идентификаторов экземпляров.
- Преимущество над некоторыми предыдущими ответами: нет необходимости в
jq
или другой команде для фильтрации вывода.
- Недостаток по сравнению с истинным обратным фильтром: вероятно, будет намного медленнее при большом количестве экземпляров.
Ответ 5
У меня была такая же проблема, и я понял, как запросить тег-значения
у вас, скорее всего, будет одинаковый ключ тега, определенный для всех экземпляров; Я определил тег-ключ "Имя машины" во всех моих экземплярах, и я хочу отфильтровать значения с именем тега
Ниже приведен пример фильтрации, где Name = Machine1
используйте параметр
--filters "Name=tag-key,Values=MachineName" "Name=tag-values,Values=Machine1"
Это отлично работает для меня
Ответ 6
AFAIK непосредственно через CLI, вы не сможете этого сделать.
В синтаксисе, который вы используете, я могу предположить, что вы используете старый cli. Я предлагаю вам загрузить новый CLI http://aws.amazon.com/cli/ и вызвать
aws ec2 describe-instances --output json
из python, ruby или любого языка сценариев, вам может понравиться анализировать фильтрацию json output, используя правильное регулярное выражение в соответствии с вашими потребностями.
Ответ 7
Я тоже был полностью потрясен тем, как сложно это сделать через CLI. Мне понравился user2616321 ответ, но у меня была небольшая проблема, заключающаяся в том, что он выводил точные поля, которые я хотел на каждый экземпляр. Проведя некоторое время, столкнувшись с JMESPath и синтаксисом запроса, я закончил создание небольшого ruby script, чтобы сделать это. Если кто-то хочет сохранить несколько минут, написав один из своих, вот он:
#!/usr/bin/env ruby
require 'json'
# We'll output any instance that doesn't contain all of these tags
desired_tags = if ARGV.empty?
%w(Name)
else
ARGV
end
# Put the keys we want to output per instance/reservation here
reservation_keys = %w(OwnerId RequesterId)
instance_keys = %w(Tags InstanceId InstanceType PublicDnsName LaunchTime PrivateIpAddress KeyName)
instances_without_tags = []
# Just use CLI here to avoid AWS dependencies
reservations = JSON.parse(
`aws ec2 describe-instances`
)["Reservations"]
# A reservation is a single call to spin up instances. You could potentially
# have more than one instance in a reservation, but often only one is
# spun up at a time, meaning there is a single instance per reservation.
reservations.each do |reservation|
reservation["Instances"].each do |instance|
# Filter instances without the desired tags
tag_keys = instance["Tags"].map { |t| t["Key"] }
unless (tag_keys & desired_tags).length == desired_tags.length
instances_without_tags <<
reservation.select { |k| reservation_keys.include?(k) }.
merge(instance.select { |k| instance_keys.include?(k) })
end
end
end
puts JSON.pretty_generate(instances_without_tags)
Ответ 8
Вы всегда можете это сделать:
ec2-describe-instances | grep -v "Name"
: Р