如何使用输入转换器进行 CloudWatch 规则目标 SSM 运行命令 - AWS-RunShellScript

如何使用输入转换器进行 CloudWatch 规则目标 SSM 运行命令 - AWS-RunShellScript

每当容器的状态发生变化时,我都会尝试在我们的一个实例上执行脚本。我正在创建一个目标,SSM Run Command其中包含以下文档:AWS-RunShellScript (Linux)

我本以为我可以以某种方式将事件中的数据传递到脚本中,但我找不到这样做的方法。我认为可以做到的方法是使用Input Transformer

输入路径:{"lastStatus":"$.detail.lastStatus"}

模板:{ "commands":["/path/to/script <lastStatus>"] }

但我收到以下错误

目标 [id] 的输入模板包含引号内的占位符

我尝试不通过 Lambda 向其添加额外的组件。

答案1

InputTemplate 值需要是有效的 JSON 字符串。因此,您的输入模板需要转义 JSON。

以下是转义的 JSON 字符串作为 JSON 值的示例(取自 aws batch state change 事件):

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

答案2

我不知道您是否最终解决了这个问题,但我会为在谷歌搜索时遇到此问题的任何人发布我的解决方案。

我最终创建了一个自定义命令文档,其中包含一个额外的参数,专门用于我感兴趣的值。这样,我在模板中指定占位符时就不必引用它,我可以直接传递它。基于现有 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>}(注意没有引号)在模板中,就可以了。

我还没有确切地测试过这种安排,但是我已经测试了一个类似的安排(我想要提取的是事件时间),并且效果很好。

相关内容