如何从ec2 describe-instances中提取特定的键值标记

时间:2016-10-06 17:50:50

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

我从describe-instances获得了以下内容:

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

对于每个实例,我想提取PublicDnsName和" budget_cluster"的值。标记键。如何使用ec2 describe-instancesjq

执行此操作

3 个答案:

答案 0 :(得分:6)

修改Frédéric的答案:

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

我已将输出更改为text,这会删除尽可能多的格式,并选择| [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

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

答案 1 :(得分:1)

使用jq 1.5或更高版本(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

答案 2 :(得分:0)

@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"
    ]
]