从AWS CloudFormation describe-stacks获取输出

90
我正在使用以下命令通过AWS Cli获取所需的堆栈信息:

describe-stacks

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的值,即我的URL。

因为我只需要这个值,而不是其他的。

通过aws cloudformation describe-stacks,这是否可能?

编辑

我刚意识到我可以使用--query

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

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

5个回答

149

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

--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

2
谢谢,这正是我今天在寻找的。 - user1432403
3
只是给其他人提醒一下,我不得不使用双引号 " 而不是单引号 ' - Tobin
1
如果你想获取多个输出(以制表符分隔在一行中),你可以使用以下命令:`--query 'Stacks[0].Outputs[?OutputKey==\`ParamOne\` || OutputKey==\`ParamTwo\` || OutputKey==\`ParamThree\`].OutputValue' --output text` - Koka
1
然而,返回参数的顺序是随机的,您不能依赖它们的索引来提取它们。为了可靠地检索多个参数,请将它们作为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')` - Koka
1
对于 OP 的示例,它将输出 {"Ec2Sg": "sg-97e13dff", "DbUrl": "myUrl"}。按名称获取值比按索引获取值要好得多。 - Andy
显示剩余5条评论

27

尽管查询功能可行,但如果您有多个堆栈,则可能会出现问题。 实际上,您可能应该利用出口来处理那些具有不同和权威性的事物。

例如,如果您将CloudFormation片段修改为以下内容:

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

那么您可以使用:

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

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


堆栈创建失败的说法是真的吗?我发现输出结果重复了。 - undefined
请查看此页面上的注释:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html。具体来说:“对于每个AWS账户,导出名称在一个区域内必须是唯一的。” - undefined
没问题,看起来没错。但是似乎云形成并没有强制执行这一点。我可以部署多个具有相同输出的堆栈而不会出错。 - undefined

5
避免使用硬编码索引,如[0]。当您有多个堆栈时,这将导致查询结果不可预测。尝试使用更动态的查询,例如以下内容:
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

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


1
如果堆栈名称已知,则此方法应该是正确的答案,因为它避免了在帐户中存在大量导出且您想要的信息不在第一个响应块中时,在list-exports上获取大小问题。查询内部的 StackName=='mystack' 可以通过在 cli 命令中指定 --stack-name=mystack 来避免。然后查询变成 "Stacks[].Outputs[?OutputKey=='my_output_key'].OutputValue" - shonky linux user

3
为了澄清正确使用list-exports的方法: 上述帖子存在一点问题,我们不能在输出名称周围使用 \'或 \ \`。 正确的语法是使用单引号 '而不使用转义字符。 例如: 使用波浪线转义
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)均区分大小写。例如,如果您使用

--query "Exports[?Name=='myexportname'].value"

输出将为空。


0

在使用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

不太有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接