【问题标题】:Getting Outputs from aws cloudformation describe-stacks从 aws cloudformation describe-stacks 获取输出
【发布时间】:2017-05-28 11:08:12
【问题描述】:

我正在使用以下内容通过 AWS Cli 获取我想要的 stack information

aws cloudformation --region ap-southeast-2 describe-stacks --stack-name mystack

返回结果OK:

{
    "Stacks": [
        {
            "StackId": "arn:aws:mystackid", 
            "LastUpdatedTime": "2017-01-13T04:59:17.472Z", 
            "Tags": [], 
            "Outputs": [
                {
                    "OutputKey": "Ec2Sg", 
                    "OutputValue": "sg-97e13dff"
                }, 
                {
                    "OutputKey": "DbUrl", 
                    "OutputValue": "myUrl"
                }
            ], 
            "CreationTime": "2017-01-13T03:27:18.893Z", 
            "StackName": "mystack", 
            "NotificationARNs": [], 
            "StackStatus": "UPDATE_ROLLBACK_COMPLETE", 
            "DisableRollback": false
        }
    ]
}

但我不知道如何只返回 OutputValue 的值,即 myUrl

因为我不需要其余的,只需要 myUrl。

这可以通过 aws cloudformation describe-stacks 实现吗?

编辑

我才意识到我可以使用 --query:

--query "Stacks[0].Outputs[1].OutputValue"

会得到我想要的,但我想使用 DbUrl,否则如果输出的数量发生变化,我的结果将出乎意料。

【问题讨论】:

    标签: amazon-cloudformation aws-cli


    【解决方案1】:

    我得到了答案,请使用以下内容:

    --query "Stacks[0].Outputs[?OutputKey=='DbUrl'].OutputValue" --output text
    

    或者

    --query 'Stacks[0].Outputs[?OutputKey==`DbUrl`].OutputValue' --output text
    

    或者

    --query 'Stacks[?StackName=='mystack'][].Outputs[?OutputKey==`DbUrl`].OutputValue' --output text
    

    【讨论】:

    • 谢谢,这正是我今天要找的。​​span>
    • 对于其他人,我不得不使用" 而不是'
    • 如果你想获取多个输出(标签分隔在一行中)你可以使用--query 'Stacks[0].Outputs[?OutputKey==`ParamOne` || OutputKey==`ParamTwo` || OutputKey==`ParamThree`].OutputValue' --output text
    • 但是,参数的返回顺序是随机的,您不能依靠它们的索引来提取它们。对于要检索的多个参数,将它们可靠地返回为 json 并使用 jq 提取它们,即。 --query 'Stacks[0].Outputs[?OutputKey==`ParamOne` || OutputKey==`ParamTwo` || OutputKey==`ParamThree`]' >> params.txt; one=$(cat params.txt | jq -r '.[] | select(.OutputKey=="ParamOne") | .OutputValue'); two=$(cat params.txt | jq -r '.[] | select(.OutputKey=="ParamTwo") | .OutputValue'); three=$(cat params.txt | jq -r '.[] | select(.OutputKey=="ParamThree") | .OutputValue')
    • 对于 OP 的示例,它将输出 {"Ec2Sg": "sg-97e13dff", "DbUrl": "myUrl"}。通过名称获取值比通过索引获取值要好得多。
    【解决方案2】:

    避免使用硬编码索引(例如堆栈名称)。当您有多个堆栈时,这将导致无法预测的查询返回。尝试更动态的查询,例如:

    aws cloudformation describe-stacks --region my_region --query "Stacks[?StackName=='my_stack_name'][].Outputs[?OutputKey=='my_output_key'].OutputValue" --output text
    

    对于您的示例,这将是:

    aws cloudformation describe-stacks --region ap-southeast-2 --query "Stacks[?StackName=='mystack'][].Outputs[?OutputKey=='Ec2Sg'].OutputValue" --output text
    

    注意[]。没有它,您的查询将不会返回任何内容。

    【讨论】:

      【解决方案3】:

      澄清使用列表导出的正确方法: 上面的帖子有一点问题,我们不能在输出名称周围使用 \' 或 \`。正确的语法是使用单引号'而不使用转义字符。

      例子:

      使用波浪号转义

      C:\>aws cloudformation list-exports --query "Exports[?Name==\`my-output-name4\`].Value" --no-paginate --output text
      
      Bad value for --query Exports[?Name==\`my-output-name4\`].Value: Bad jmespath expression: Unknown token \:
      Exports[?Name==\`my-output-name4\`].Value
      

      使用单引号转义:

      C:\>aws cloudformation list-exports --query "Exports[?Name==\'my-output-name4\'].Value" --no-paginate --output text
      
      Bad value for --query Exports[?Name==\'my-output-name4\'].Value: Bad jmespath expression: Unknown token \:
      Exports[?Name==\'my-output-name4\'].Value
      

      最后,正确的语法:

      C:\>aws cloudformation list-exports --query "Exports[?Name=='myexportname'].Value" --no-paginate --output text
      
      

      如果您有错误或意外的空输出,请注意所有 CLI 都区分大小写。例如,如果您使用了

      --查询“Exports[?Name=='myexportname'].value

      输出将为空。

      【讨论】:

        【解决方案4】:

        使用 Windows AWS CLI,我必须确保 --query 参数被双引号引用。

        aws cloudformation describe-stacks --stack-name <stack_name> --query "Stacks[0].Outputs[?OutputKey==`<key_we_want>`].OutputValue" --output text

        未能使用双引号,导致查询返回:

        Stacks[0].Outputs[?OutputKey==].OutputValue

        没那么有用。

        【讨论】:

          【解决方案5】:

          虽然查询有效,但如果您有多个堆栈,则可能会出现问题。实际上,您应该可能将导出用于独特和权威的事物。

          例如 - 如果您将 CloudFormation sn-p 修改为如下所示:

          "Outputs" : {
            "DbUrl" : {
              "Description" : "My Database Url",
              "Value" : "myUrl",
              "Export" : {
                "Name" : "DbUrl"
              }
            }
          }
          

          那么你可以使用:

          aws cloudformation list-exports --query "Exports[?Name==\`DbUrl\`].Value" --no-paginate --output text
          

          检索它。导出必须是唯一的 - 只有一个堆栈可以导出任何给定的名称。这样,您就可以确保每次都能获得正确的价值。如果您尝试创建一个新堆栈来导出已存在于其他地方的名称,则该堆栈创建将失败。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-06-17
            • 2018-07-01
            • 2019-07-19
            • 1970-01-01
            • 2017-03-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多