【问题标题】:How to extract a particular Key-Value Tag from ec2 describe-instances如何从 ec2 describe-instances 中提取特定的键值标签
【发布时间】:2016-10-06 17:50:49
【问题描述】:

我从 describe-instances 得到以下信息:

{
    "Reservations": [
        {
            "Instances": [
                {
                    "PublicDnsName": "ec2-xxxxx.amazonaws.com",
                    "Tags": [
                        {
                            "Key": "Name",
                            "Value": "yyyyy"
                        },
                        {
                            "Key": "budget_cluster",
                            "Value": "zzzzz"
                        },
                        {
                            "Key": "poc",
                            "Value": "aaaaaaa"
                        }
                    ]
                }
            ]
        }
    ]
}

对于每个实例,我想提取 PublicDnsName 和“budget_cluster”标签键的值。如何使用ec2 describe-instancesjq 执行此操作?

【问题讨论】:

  • 您提供的示例 JSON 不完整。请修改您的帖子,以包含足以满足此目的的极简有效 JSON 片段。
  • 对。它不是有效的 json。但它包含的信息足以让了解 ec2 和 jq 的人给出可行的解决方案。

标签: amazon-web-services amazon-ec2 aws-cli jq


【解决方案1】:

修改弗雷德里克的回答:

aws ec2 describe-instances --output text --query \
   'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value | [0]]'

会产生:

ec2-xxxxx.amazonaws.com zzzzz
ec2-bbbbb.amazonaws.com yyyyy

我已将输出更改为文本,这会尽可能多地删除格式并使用| [0] 选择单个标记值,因为无论如何每个实例只会有一个。最后,我删除了最后的[],这样结果列表就不会变平。这样,在文本输出中,每个条目都将在自己的行上。

您还可以通过仅选择实际具有该标签的实例来使其更加健壮。您可以通过进一步修改--query 参数来实现,但在这种情况下最好使用--filters 参数,因为它执行服务端过滤。具体来说,您需要tag-key 过滤器:--filters "Name=tag-key,Values=budget_cluster"

aws ec2 describe-instances --output text \
    --filters "Name=tag-key,Values=budget_cluster" --query \
   'Reservations[].Instances[?Tags[?Key==`budget_cluster`]].[PublicDnsName, Tags[?Key==`budget_cluster`].Value | [0]]'

仍会产生:

ec2-xxxxx.amazonaws.com zzzzz
ec2-bbbbb.amazonaws.com yyyyy

但是通过网络,您只能获得您关心的实例,从而节省带宽费用。

【讨论】:

    【解决方案2】:

    使用jq 1.5或更高版本,最简单的方法是使用from_entries

    在对说明性输入进行最小修复后,以下调用:

    $ jq '.Reservations[]
          | .Instances[]
          | [.PublicDnsName, (.Tags|from_entries|.budget_cluster)]' input.json
    

    产生:

    [
      "ec2-xxxxx.amazonaws.com",
      "zzzzz"
    ]
    

    如果您没有 jq 1.5 或更高版本,以下应该可以工作:

    $ jq1.4 '.Reservations[]
    | .Instances[]
    | [.PublicDnsName, (.Tags[]|select(.Key=="budget_cluster") | .Value)]' input.json
    

    【讨论】:

    • 无论是这个还是我快速而轻率地修改它的尝试都不起作用。他们产生:jq: error: Cannot use null as object key jq: error: Cannot use null as object key
    • 给出的解决方案假定您拥有 jq 1.5 或更高版本(1.5 是最新的官方版本)。查看发帖更新。
    • 您的 jq1.4 解决方案有效,将其放入一个数组中(每个对联都用方括号括起来。)
    【解决方案3】:

    @peak 的回答非常棒,我在 jq 部分一直向他学习,但同样,您可以从 AWS CLI 获得很多成果

    aws ec2 describe-instances --query \
       'Reservations[].Instances[].{PublicDnsName:PublicDnsName, Budget:Tags[?Key==`budget_cluster`].Value}'
    

    会产生

    [
        {
            "PublicDnsName": "ec2-xxxxx.amazonaws.com",
            "Budget": [
                    "zzzz",
            ]
        }
    ]
    

    如果您不想从中创建一个新的严格 JSON,只需取值

    aws ec2 describe-instances --query \
       'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value][]'
    

    会产生

    [
        "ec2-xxxxx.amazonaws.com",
        [
            "zzzz"
        ]
    ]
    

    【讨论】:

    • 这如你所说。但我正在寻找的是只提取 PublicDNSName 和 Budget 键的值,没有任何其他文本。
    • 添加没有 JSon 键的示例,这只是返回一个数组而不是一个 JSon
    • 感谢您的更新,但我正在寻找的只是一个简单的:"ec2.." "zzz"
    • 如果你想要纯文本,改变输出;有 3 种可能的输出格式:texttablejson - 大多数时候默认是 json 和你想要的 - 在你的情况下,将输出更改为文本,你就会得到你想要的。乔丹也补充了我的回答
    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 2023-03-03
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多