Назад | Перейти на главную страницу

Как использовать преобразователь ввода для команды запуска SSM для правила CloudWatch - AWS-RunShellScript

Я пытаюсь выполнить сценарий в одном из наших экземпляров при изменении состояния контейнера. Я создаю цель SSM Run Command с документом AWS-RunShellScript (Linux)

Я бы подумал, что могу каким-то образом передать данные из события в сценарий, но я не могу найти способ сделать это. Я думал, что это можно сделать, используя Input Transformer

Путь ввода: {"lastStatus":"$.detail.lastStatus"}

Шаблон: { "commands":["/path/to/script <lastStatus>"] }

но я получаю следующую ошибку

InputTemplate для цели [id] содержит заполнитель в кавычках

Я пытался не добавлять к этому дополнительный компонент с помощью Lambda.

Я не знаю, приходилось ли вам когда-нибудь разбираться в этом, но я опубликую свое решение для всех, кто столкнется с этим вопросом во время поиска в Google.

Я закончил тем, что создал пользовательский командный документ с дополнительным параметром специально для интересующего меня значения. Таким образом, мне не нужно было цитировать заполнитель при указании его в шаблоне, я мог просто передать его напрямую. Пример, основанный на существующем командном документе RunShellScript:

{
    "schemaVersion": "2.2",
    "description": "Pass previous status to local script.",
    "parameters": {
        "scriptPath": {
            "type": "String",
            "descripton": "(Required) The absolute path to the local script.",
            "maxChars": 4096
        },
        "lastStatus": {
            "type": "String",
            "description": "The previous status of the container.",
            "maxChars": 100
        }
        "workingDirectory": {
            "type": "String",
            "default": "",
            "description": "(Optional) The path to the working directory on your instance.",
            "maxChars": 4096
        },
        "executionTimeout": {
            "type": "String",
            "default": "3600",
            "description": "(Optional) The time in seconds for a command to complete before it is considered to have failed. Default is 3600 (1 hour). Maximum is 172800 (48 hours).",
            "allowedPattern": "([1-9][0-9]{0,4})|(1[0-6][0-9]{4})|(17[0-1][0-9]{3})|(172[0-7][0-9]{2})|(172800)"
        }
    },
    "mainSteps": [{
        "action": "aws:runShellScript",
        "name": "runShellScript",
        "inputs": {
            "runCommand": [
                "{{ scriptPath }} '{{ lastStatus }}'"
            ],
            "workingDirectory": "{{ workingDirectory }}",
            "executionTimeout": "{{ executionTimeout }}"
        }
    }]
}

Тогда вы можете просто установить "lastStatus": "$.detail.lastStatus" во входном пути и {scriptPath: "/path/to/script", "lastStatus": <lastStatus>} (обратите внимание на отсутствие кавычек) в шаблоне, и все будет в порядке.

Я точно не тестировал эту схему, но я протестировал аналогичную (я хотел извлечь время события), и она отлично сработала.

Значение InputTemplate должно быть допустимой строкой JSON. Следовательно, ваш шаблон ввода должен быть экранирован JSON.

Вот пример экранированной строки JSON в качестве значения JSON (взятого из события изменения состояния пакета aws):

"InputPathsMap": {
    "job_number" : "$.detail.container.environment.JOB_NUMBER",
    "status" : "$.detail.status"
},
"InputTemplate": "\"{ \\\"job\\\": \\\"StatusChangeJob\\\", \\\"payload\\\": { \\\"job_number\\\": \\\"<job_number>\\\", \\\"status\\\": \\\"<status>\\\" } }\""