ssm getParameterのName変数に、別変数で定義してある文字列を代入する方法をご教示ください。

0

◆質問内容  ssm getParameterのName変数に、別変数で定義してある文字列が正しくできないため、ご質問いたします。

◆状況  StateMachineにて、次の構成をとっています。

 ①pass stateにて、statemachineの引数を変数hogeで受け取り、ssmパラメタストアの値取得用パスを作成する

 ②task stateにて、①で作成したパスをssm getParameter指定引数Nameに代入してgetParameterを実行

 この際、①→②の値取得用文字列は正しく渡されていることをテストモードのデバッグから確認しているのですが、

 ②で受け取った文字列をgetParameterのParameters:{ "Name" }に正しく代入できず苦慮しております。

◆JSON

{ "Comment": "An example of combining workflows using a Step Functions StartExecution task state with various integration patterns.",

"StartAt": "Pass",

"States": {

"Pass": {
  "Type": "Pass",
  "Next": "get command",
  "Parameters": {
    "reqform.$": "States.Format('/aaa/bbb/{}/ccc', $.hoge)"
  }
},
"get command": {
  "Type": "Task",
  "Parameters": {
    "Name": "reqform"
  },
  "Resource": "arn:aws:states:::aws-sdk:ssm:getParameter",
  "End": true
}

} }

◆実行結果

{ "cause": "Service returned error code ParameterNotFound (Service: Ssm, Status Code: 400, Request ID: 167a7413-1352-4ba7-8b37-6f10c821d5c9)", "error": "Ssm.ParameterNotFoundException",

"inspectionData": { "afterInputPath": "{\n "reqform": "/aaa/bbb/JOB-1/ccc"\n}", "afterParameters": "{"Name":"reqform"}", "input": "{\n "reqform": "/aaa/bbb/JOB-1/ccc"\n}" }, "status": "FAILED" }

尚、afterInputPathの値を直接Nameに設定してgetParameterを実行した場合、正しくcccの値が返却されているので、 パラメタストアのパスミスは無いと考えております。

1回答
0
承認された回答

回答

ステートマシンの json より、get command State の Parameters に以下のように記載が見受けられました。

"Parameters": {
    "Name": "reqform"
},

この場合、getParameter API [1] の Name に reqform という文字列を渡すこととなります。 この結果、存在しないパラメータ reqform の値を取得しようとしてエラー(Service returned error code ParameterNotFound)が発生しているものと見受けられます。

ドキュメント [2] に記載があるとおり、Parameters において State の入力のパスを使用して値を選択する必要がある場合は、キーの名前を .$ で終わらせる必要がございます。 そのため、get command State の Parameters を以下のように修正することで getParameter API の Name に Pass State の reqform の値(すなわち States.Format で作成した値取得用パス /aaa/bbb/{}/ccc)を渡すことが可能かと存じております。

"Parameters": {
    "Name.$": "reqform"
},

修正したステートマシン全体は以下のようになると存じております。

{
    "Comment": "An example of combining workflows using a Step Functions StartExecution task state with various integration patterns.",
    "StartAt": "Pass",
    "States": {
        "Pass": {
            "Type": "Pass",
            "Next": "get command",
            "Parameters": {
                "reqform.$": "States.Format('/aaa/bbb/{}/ccc', $.hoge)"
            }
        },
        "get command": {
            "Type": "Task",
            "Parameters": {
                "Name.$": "reqform"
            },
            "Resource": "arn:aws:states:::aws-sdk:ssm:getParameter",
            "End": true
        }
    }
}

参考資料

[1] GetParameter - AWS Systems Manager - https://docs.aws.amazon.com/ja_jp/systems-manager/latest/APIReference/API_GetParameter.html

[2] パラメータ | InputPath、パラメータ、 ResultSelector - AWS Step Functions - https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/input-output-inputpath-params.html#input-output-parameters

それぞれの値は、ステートマシンの定義に含める静的な値、または入力からパスまたはコンテキストオブジェクトで選択した静的な値を使用できます。パスを使用して値を選択するキーと値のペアの場合、キーの名前は .$ で終わる必要があります。

AWS
回答済み 2ヶ月前
  • ご教示頂いたJSON内容「"Name.$": "reqform"」ですと、残念ながらエラー「The value for the field must be a valid JSONPath or intrinsic function expression.」になってしまいました。 再度参考資料で頂いた各種情報を基に、次の通り修正し期待動作結果を得ることが確認できました。

        "Name.$": "$.reqform"
    

    この度はご助力有難うございました。

  • 修正案に誤りが含まれており、大変失礼いたしました。

    "Name.$": "reqform"」にて設定しようとすると、Yamada 様にてご確認いただいたとおりエラー(The value for the field must be a valid JSONPath or intrinsic function expression.)が発生します。 Yamada 様のご認識のとおり、正しくは以下のとおり記載することで States.Format で作成した値取得用パス /aaa/bbb/{}/ccc を API に渡すことが可能かと存じております。 (手元では「"Name.$": "$.reqform"」にて動作確認を行ったのですが回答を記載する際に誤ってしまいました。)

    "Parameters": {
        "Name.$": "$.reqform"
    },

    期待通りの動作を得ることができたとのことで、何よりでございます。 ご指摘および解決方法をご教示くださり、ありがとうございました。

ログインしていません。 ログイン 回答を投稿する。

優れた回答とは、質問に明確に答え、建設的なフィードバックを提供し、質問者の専門分野におけるスキルの向上を促すものです。

質問に答えるためのガイドライン