Как использовать AWS-RunRemoteScript в CLI AWS? - PullRequest
1 голос
/ 17 июня 2019

Что я пытаюсь сделать

Я пытаюсь использовать интерфейс командной строки AWS в Windows, чтобы извлечь сценарий PowerShell из репозитория GitHub и создать экземпляр AWS EC2,затем запустите этот скрипт на экземпляре.

Что я пробовал

Я знаю, что экранированные двойные кавычки (\ ") действительны, так как я пытался без них безрезультатно.также попытался поместить часть JSON, следующую за --parameters, в отдельный файл и загрузить этот файл в команду, но в этом случае он пожаловался на форматирование.

Я пробовал команду как в PowerShell, так и в CMD Windows(они различаются по синтаксису, а именно с двойными кавычками.) Я включил оба варианта ниже.

Используя консоль AWS EC2, я могу заставить все это работать с помощью графического интерфейса. Ключ теперьзаставить его работать также с помощью командной строки.

Вот команда для PowerShell:

aws ssm send-command --document-name "AWS-RunRemoteScript" --document-version "1" --targets "Key=instanceids,Values=<INSTANCE-ID>" --parameters '{\"sourceType\":[\"GitHub\"],\"sourceInfo\":{\"owner\":\"<USERNAME>\",\"repository\":\"Projects\",\"path\":\"test_script.ps1\"},\"commandLine\":[\".\\test_script.ps1\"],\"workingDirectory\":[""],\"executionTimeout\":[\"3600\"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region us-east-2

Проблема, похоже, исходит отпараметр --parameters и JSON, следующий за ним.

Вот команда для Git Bash (которая на самом деле работает):

aws ssm send-command --document-name "AWS-RunRemoteScript" --document-version "1" --targets "Key=instanceids,Values=<INSTANCE-ID>" --parameters '{"sourceType":["GitHub"],"sourceInfo":["{\"owner\": \"<USERNAME>\", \"repository\": \"Projects\", \"path\": \"test_script.ps1\"}"],"commandLine":[".\\test_script.ps1"],"workingDirectory":[""],"executionTimeout":["3600"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region us-east-2

Вот полученная ошибка:

Parameter validation failed: Invalid type for parameter Parameters.sourceInfo, value: OrderedDict([('owner', '<USERNAME>'), ('repository', 'Projects'), ('path', 'test_script.ps1')]), type: <class 'collections.OrderedDict'>, valid types: <class 'list'>, <class 'tuple'>


Как указать эти параметры в соответствующем формате?

1 Ответ

0 голосов
/ 13 июля 2019

Существует некоторая проблема с синтаксическим анализом JSON из PowerShell или из CMD.exe, эта же команда отлично работает в Linux Shell:

aws ssm send-command --document-name "AWS-RunRemoteScript" --document-version "1" --targets "Key=instanceids,Values=mi-012dcb3ecea45b678" --parameters '{"sourceType":["GitHub"],"sourceInfo":[" {\n \"owner\":\"<user>\",\n \"repository\":\"<my-repo>\",\n \"path\":\"get-param.ps1\",\n \"getOptions\":\"branch:master\",\n \"tokenInfo\":\"{{ssm-secure:<my-token>}}\"\n }"],"commandLine":["get-param.ps1"],"workingDirectory":[""],"executionTimeout":["3600"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region eu-west-1

Я действительно открыл эту проблему с командой awscli, они подтвердили этот тип ограничений синтаксического анализа в Windows, проверьте: https://github.com/aws/aws-cli/issues/4212#issuecomment-507378423

Итак, если вы используете тот же подход, чтобы использовать параметры в файле json, вы можете сделать это, как показано ниже:

Создайте файл param.json с содержанием ниже:

{
    "sourceType": [
        "GitHub"
    ],
    "sourceInfo": [
        " {\n \"owner\":\"<user>\",\n \"repository\":\"<repo>\",\n \"path\":\"get-param.ps1\",\n \"getOptions\":\"branch:master\",\n \"tokenInfo\":\"{{ssm-secure:<token>}}\"\n }"
    ],
    "commandLine": [
        "get-param.ps1"
    ],
    "workingDirectory": [
        ""
    ],
    "executionTimeout": [
        "3600"
    ]
}

Тогда вы сможете выполнить команду, как показано ниже:

aws ssm send-command --document-name "AWS-RunRemoteScript" --document-version "1" --targets "Key=instanceids,Values=mi-012dcb3ecea45b678" --parameters file://param.json --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region eu-west-1

Это будет работать как с cmd.exe, так и с PowerShell

...