簡體   English   中英

來自狀態輸入的參考值,在 SSMSendCommand API 中使用 JSONPath 語法逐步通過需要數組的參數

[英]Reference value from state’s input, using JSONPath syntax in a SSMSendCommand API step through parameter which expects an array

我在 AWS 狀態機上為 api aws-sdk:ssm:sendCommand 定義了以下步驟

{
  "Type": "Task",
  "Parameters": {
    "DocumentName.$": "$.result.DocumentName",
    "InstanceIds.$": "$..Dimensions[?(@.Name=~/.*InstanceId.*/)].Value",
    "MaxErrors": "0",
    "MaxConcurrency": "100%",
    "CloudWatchOutputConfig": {
      "CloudWatchLogGroupName": "diskspace-log",
      "CloudWatchOutputEnabled": true
    },
    "Parameters": {
      "workingDirectory": [
        ""
      ],
      "executionTimeout": [
        "3600"
      ],
      "commands": [
        "echo -------------------Mounting volume without signals $..Dimensions[?(@.Name=~/.*device.*/)].Value---------------------",
        "echo",
        "mount $..Dimensions[?(@.Name=~/.*device.*/)].Value"
      ]
    }
  }
}

section: "commands": [] 需要一個數組。

“命令”應該接受輸入引用作為模式中的任何其他參數,因此理論上可以使用 json 路徑參數(示例:“size.$”:“$.product.details.size”)來引用所需的參數輸入。

https://docs.aws.amazon.com/step-functions/latest/dg/input-output-inputpath-params.html

以下示例在不使用輸入引用的情況下工作:

"commands": [
"echo -------------------Mounting /dev/ebs---------------------",
"echo",
"mount /dev/ebs"
]

但我需要從輸入中引用,硬編碼值對我不起作用。 我試過了,但沒有用。

     "commands": [
        "echo -------------------Mounting volume without signals $..Dimensions[?(@.Name=~/.*device.*/)].Value---------------------",
        "echo",
        "mount $..Dimensions[?(@.Name=~/.*device.*/)].Value"
      ]

也試過,也不起作用:

"commands.$": "States.Array(States.Format('echo -------------------Mounting volume without signals {} ---------------------', $..Dimensions[?(@.Name=~/.*device.*/)].Value),'echo',States.Format('mount {}', $..Dimensions[?(@.Name=~/.*device.*/)].Value))"

我相信一些提供的內部函數將有助於實現預期的結果,但我不知道如何正確設置語法。

https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-intrinsic-functions.html#asl-intrsc-func-arrays

該步驟調用 RunShellScript 類型的 documentCommand。 並執行狀態機步驟中參數提供的命令。

我得到了輸出:

States.Format('echo -------------------Mounting volume without signals {} ---------------------', $..Dimensions[?(@.Name=~/.*device.*/)].Value)'

它沒有檢測到輸入參考,我希望輸出。

-------------------Mounting volume without signals /dev/ebs ---------------------

並在后台執行:

mount /dev/ebs

我能夠通過傳遞狀態流發送命令,這里是定義:

{
  "Type": "Pass",
  "Next": "SendCommand",
  "ResultPath": "$.ForArgs",
  "Parameters": {
    "Params": {
      "Args": [
        {
          "Arg1": "ec2-metadata -i"
        },
        {
          "Arg2": "echo"
        },
        {
          "Arg3.$": "States.Format('echo -------------------Mounting volume without signals {} ---------------------', States.ArrayGetItem($..Dimensions[?(@.Name=~/.*device.*/)].Value, 0))"
        },
        {
          "Arg4": "echo"
        },
        {
          "Arg5.$": "States.Format('mount {}', States.ArrayGetItem($..Dimensions[?(@.Name=~/.*device.*/)].Value, 0))"
        },
        {
          "Arg6.$": "States.Format('echo Checking if device {} is mounted', States.ArrayGetItem($..Dimensions[?(@.Name=~/.*device.*/)].Value, 0))"
        },
        {
          "Arg7.$": "States.Format('if findmnt --source \"{}\" >/dev/null', States.ArrayGetItem($..Dimensions[?(@.Name=~/.*device.*/)].Value, 0))"
        },
        {
          "Arg8": "\tthen echo device is mounted"
        },
        {
          "Arg9": "\telse echo device is not mounted"
        },
        {
          "Arg10": "fi"
        }
      ]
    }
  }
}

接下來是 sendCommandApi:

  "commands.$": "$.ForArgs.Params.Args[*][*]"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM