Ни один JSON объект не может быть декодирован | AWS Cloudwatch - PullRequest
0 голосов
/ 11 марта 2020

Итак, у меня есть простой скрипт, который удаляет тревоги Cloudwatch каждый месяц. Однако сегодня я заметил, что не вижу, что JSON объект может быть декодирован с ошибкой.

Причина была проста:

У меня приблизительно 1500 аварийных сигналов с именем в формате ниже

[Production-ALARM]-PING.Node+[10.0.0.0]-MAX-USAGE

Я знаю, что нам нужно добавить '["в начале и"]', чтобы удалить такие имена. Разговор таков: если я запускаю приведенную ниже команду, она выполняется без каких-либо проблем и удаляет соответствующий аварийный сигнал.

aws cloudwatch delete-alarms --alarm-name '["[Production-ALARM]-PING.Node+[10.0.0.0]-MAX-USAGE"]'

Однако, поскольку количество аварийных сигналов достаточно велико, у меня есть список аварийных сигналов как текстовый файл с добавленным '[""]', который я передаю в качестве параметра простому для l oop в bash.

for clAlarmNames in `cat oldCloudwatchAlarms`
do
   #echo ${clAlarmNames}
   aws cloudwatch delete-alarms --alarm-names "${clAlarmNames}"
done

Формат входного файла: oldCloudwatchAlarms (расширения для файл)

Пример содержимого файла: Ниже приведен пример содержимого

'["[AB:Production-ALARM]-CLI.Node+[10.0.0.1]-Alert"]'
'["[AB:Production-ALARM]-GLI.Node+[10.0.0.2]-Alert"]'

Однако он не удаляет аварийные сигналы, как ожидалось.

1 Ответ

1 голос
/ 11 марта 2020

Устранение проблемы

Удалите цитаты syntacti c из вашего файла. То есть, измените его с:

'["[AB:Production-ALARM]-CLI.Node+[10.0.0.1]-Alert"]'

на:

["[AB:Production-ALARM]-CLI.Node+[10.0.0.1]-Alert"]

... после чего вы сможете запустить:

while IFS= read -r alarm_name_json; do
  aws cloudwatch delete-alarms --alarm-name "$alarm_name_json" </dev/null
done <file.txt

Цитаты в ваших данных - это то, что мы называем "буквальными цитатами". Это данные, а не синтаксис оболочки. Кавычки , которые являются частью вашего кода , - это то, что мы называем "кавычки c" они говорят оболочке, как анализировать другое содержимое в коде.

Добавление дополнительных кавычек к вашим данным не может заменить отсутствующие кавычки syntacti c, потому что любая кавычка, которую вы добавляете к своим данным, является буквальной , а не syntacti c.


Удаление всех аварийных сигналов за один раз

Если у вас есть одно имя аварийного сигнала в строке в вашем файле, без любого [" или "] форматирования, тогда вы можете jq сделать работу для создания JSON строки со списком для вас:

aws cloudwatch delete-alarms --alarm-names "$(jq -rn '[inputs]' <alarms.txt)"

Нет l oop необходимо; просто передав все имена будильников одновременно.

...