web-dev-qa-db-ja.com

CloudWatchルールのターゲットSSM実行コマンドに入力トランスフォーマーを使用する方法-AWS-RunShellScript

コンテナの状態が変化するたびに、インスタンスの1つでスクリプトを実行しようとしています。ターゲット_SSM Run Command_を作成しています。ドキュメントはAWS-RunShellScript (Linux)です

どういうわけか、イベントからスクリプトにデータを渡すことができると思っていたでしょうが、そうする方法を見つけることができません。私がそれを行うことができると思った方法は、_Input Transformer_を使用することでした

入力パス:_{"lastStatus":"$.detail.lastStatus"}_

テンプレート:_{ "commands":["/path/to/script <lastStatus>"] }_

しかし、私は次のエラーを受け取ります

ターゲット[id]のInputTemplateには、引用符内にプレースホルダーが含まれています

私はLambdaでこれに追加のコンポーネントを追加しないようにしようとしていました。

1
Tyler Clendenin

あなたがこれを理解したことになったかどうかはわかりませんが、グーグルでこの質問に遭遇した人のために私の解決策を投稿します。

最終的に、関心のある値専用のパラメーターを追加したカスタムコマンドドキュメントを作成しました。これにより、テンプレートで指定するときにプレースホルダーを引用符で囲む必要がなく、直接渡すことができました。既存の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>}(引用符がないことに注意してください)、テンプレートにアクセスしてください。

私はこの配置を正確にテストしていませんが、同様のものをテストしました(私が抽出したかったのはイベント時間です)、それは完全に機能しました。

1

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>\\\" } }\""
1
Matt Lampe