Я пытаюсь создать цикл bash for, который передает идентификаторы экземпляров в следующую команду AWS CLI для запуска Powershell на нескольких экземплярах. Всякий раз, когда я пытаюсь расширить значение $ server либо как переменную, либо как список идентификаторов экземпляров в цикле for, я получаю сообщение об ошибке:
Произошла ошибка (InvalidInstanceId) при вызове операции SendCommand:
Вот несколько попыток заставить $server правильно расширяться при выполнении документа Run из Linux-системы с поддержкой AWS CLI. Когда я заменяю $server или ${server} тем же идентификатором экземпляра, который содержит переменная $server (i-081158da57d2a8da6), он работает без проблем. Я чувствую, что это должно быть чрезвычайно просто, но мои исследовательские навыки не позволяют мне понять, как можно расширить переменную в синтаксисе, необходимом для правильного выполнения документа SSM из AWS CLI в моем экземпляре Linux.
:~$ aws ssm send-command --document-name "AWS-RunPowerShellScript" --document-version "1" --targets '[{"Key":"InstanceIds","Values":["${server} "]}]' --parameters '{"commands":["$wmi = Get-WmiObject -Class Win32_OperatingSystem ","$uptimeMinutes = ($wmi.ConvertToDateTime($wmi.LocalDateTime)-$wmi.ConvertToDateTime($wmi .LastBootUpTime) | select-object -expandproperty "TotalMinutes")","[int]$uptimeMinutes"],"workingDirectory":[""],"executionTimeout":["60"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region us-west-2
Произошла ошибка (InvalidInstanceId) при вызове операции SendCommand:
:~$ aws ssm send-command --document-name "AWS-RunPowerShellScript" --document-version "1" --targets '[{"Key":"InstanceIds","Values":["$server"] }]' --parameters '{"commands":["$wmi = Get-WmiObject -Class Win32_OperatingSystem ","$uptimeMinutes = ($wmi.ConvertToDateTime($wmi.LocalDateTime)-$wmi.ConvertToDateTime($wmi.LastBootUpTime ) | select-object -expandproperty "TotalMinutes")","[int]$uptimeMinutes"],"workingDirectory":[""],"executionTimeout":["60"]}' --timeout-seconds 600 -- max-concurrency "50" --max-errors "0" --region us-west-2
Произошла ошибка (InvalidInstanceId) при вызове операции SendCommand:
Документ JSON заключен в одинарные кавычки, что отключает интерполяцию переменных — см. Разница между одинарными и двойными кавычками в Bash — что означает, что $server
не будет расширен.
Вот демонстрация эффекта:
[:~] $ server=banana
[:~] $
[:~] $ echo '[{"Key":"InstanceIds","Values":["$server"]}]'
[{"Key":"InstanceIds","Values":["$server"]}]
[:~] $
Если вместо этого вы используете двойные кавычки, значение интерполируется:
[:~] $ echo "[{\"Key\":\"InstanceIds\",\"Values\":[\"$server\"]}]"
[{"Key":"InstanceIds","Values":["banana"]}]
[:~] $
Обратите внимание, что мне пришлось избегать двойных кавычек внутри двойных кавычек. В противном случае они исчезнут из вывода, что сделает его недействительным JSON.
Не беспокойтесь, рад, что смог помочь. :)
Спасибо, это сработало. Я знал, что это должно быть что-то простое, я полностью растерялся... это должно было быть очевидно.