Интерфейс командной строки AWS: как расширить переменную в целях отправки команд aws ssm?

Я пытаюсь создать цикл 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:

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 080
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Документ JSON заключен в одинарные кавычки, что отключает интерполяцию переменных — см. Разница между одинарными и двойными кавычками в Bash — что означает, что $server не будет расширен.

Вот демонстрация эффекта:

[:~] $ server=banana
[:~] $ 
[:~] $ echo '[{"Key":"InstanceIds","Values":["$server"]}]'
[{"Key":"InstanceIds","Values":["$server"]}]
[:~] $

Если вместо этого вы используете двойные кавычки, значение интерполируется:

[:~] $ echo "[{\"Key\":\"InstanceIds\",\"Values\":[\"$server\"]}]"
[{"Key":"InstanceIds","Values":["banana"]}]
[:~] $ 

Обратите внимание, что мне пришлось избегать двойных кавычек внутри двойных кавычек. В противном случае они исчезнут из вывода, что сделает его недействительным JSON.

Спасибо, это сработало. Я знал, что это должно быть что-то простое, я полностью растерялся... это должно было быть очевидно.

Chris Smith 21.12.2020 03:11

Не беспокойтесь, рад, что смог помочь. :)

Aleksey Tsalolikhin 21.12.2020 03:12

Другие вопросы по теме