Подтвердить что ты не робот

Поиск всех экземпляров Amazon AWS, которые не имеют определенного тега

Я пытаюсь использовать средства командной строки Amazon AWS для поиска всех экземпляров, у которых нет указанного тега.

Поиск всех экземпляров с тегом достаточно прост, например

ec2-describe-instances --filter "tag-key=Name"

Но как бы инвертировать этот фильтр для возврата только экземпляров, у которых нет тега "Имя"?

4b9b3361

Ответ 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" : Р