Автоматизация для обнаружения не помеченных ресурсов в AWS

#json #amazon-web-services #tags #jq #aws-cli

Вопрос:

Я пытаюсь запустить вызов api, чтобы найти список ресурсов AWS, у которых нет правильных тегов, и получить вывод в файл json:

Имя: «Неиспользуемое» имя в разрешении = ложь

 aws resourcegroupstaggingapi get-resources --tags-er-page 100 | jq '.ResourceTagMappingList{} | select(contains({Tags: [{Key: "Name"}, [{Key: "Name in Resolve"}]}))' > tag.json
 

Но он дает список всех тегов вместе с тегами «Имя» и «Имя в разрешении». Я хочу отфильтровать вывод только с помощью этих 2 тегов со значениями

Фактические Результаты:

 {
 "ResourceARN":"arn:aws:backup:$Region:$AccountId:recovery-point:xxxxxxxx",
 "Tags": [
  {
   "Key: "Name",
   "Value": "eks-efs-non-prod"
  },
  {
   "Key": "Deptt"
   "Value": "XXX"
  },
  {
   "Key": "BusinessUnit"
   "Value": "XXX"
  },
  {
   "Key": "Name in Resolve"
   "Value": "True"
  },
  {
   "Key": "SysOwner"
   "Value": "XXX"
  },
  {
   "Key": "IT Director"
   "Value": "Ankur K"
  }
 ]
}
{
 "ResourceARN":"arn:aws:backup:$Region:$AccountId:recovery-point:xxxxxxxx",
 "Tags": [
  {
   "Key: "Name",
   "Value": "Unused"
  },
  {
   "Key": "Deptt"
   "Value": "XXX"
  },
  {
   "Key": "BusinessUnit"
   "Value": "XXX"
  },
  {
   "Key": "Name in Resolve"
   "Value": "false"
  },
 {
   "Key": "SysOwner"
   "Value": "XXX"
  },
  {
   "Key": "IT Director"
   "Value": "Ankur K"
  }
 ]
}
 

Ожидаемые Результаты:

 {
 "ResourceARN":"arn:aws:backup:$Region:$AccountId:recovery-point:xxxxxxxx",
 "Tags": [
  {
   "Key: "Name",
   "Value": "eks-efs-non-prod"
  },
  {
   "Key": "Name in Resolve"
   "Value": "True"
  }
 ]
}
{
 "ResourceARN":"arn:aws:backup:$Region:$AccountId:recovery-point:xxxxxxxx",
 "Tags": [
  {
   "Key: "Name",
   "Value": "Unused"
  },
  {
   "Key": "Name in Resolve"
   "Value": "false"
  }
 ]
}
 

Комментарии:

1. На какие ресурсы AWS вы ссылаетесь. AWS имеет множество сервисов и множество ресурсов.

2. Это для всех тех сервисов aws, у которых отсутствуют теги с именем тега и его значением

3. 1. JSON, который вы показали, не совсем корректен. Кроме того, было бы полезно ознакомиться с некоторыми дополнительными сведениями о результатах выполнения команды aws. 2. Показанная команда jq также (очевидно) недействительна. Это результат опечатки?

4. Пожалуйста, отредактируйте вопрос, чтобы предоставить входные данные, которые должны привести к предоставленным вами выводам, как это требуется.

Ответ №1:

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

 .Tags |= map(select(.Key | IN("Name", "Name in Resolve")))
 

Если у вашего jq этого нет IN/1 , то вы можете просто скопировать его описание в начало вашей программы:

 def IN(s): first((s == .) // empty) // false;
 

Комментарии:

1. Я попытался запустить так aws resourcegroupstaggingapi get-resources --tags-per-page 100 | jq '.Tags |= map(select(.Key | IN("Name", "Name in Resolve")))' > tag.json , но это выдает ошибку

2. Программа, которую я дал, работает с JSON, который вы показали, а не с результатом aws команды, так как вы не указали эти детали.