Aws-cli: 我想通过匹配标签值的子字符串来过滤实例

创建于 2016-09-29  ·  3评论  ·  资料来源: aws/aws-cli

我要为此扯掉我的头发。 我的所有实例都有一个名为“Data”的标签,“Data”的值是以下之一:“foo=yes,bar=yes”、“foo=yes、bar=no”、“foo=no,bar” =yes", "foo=no,bar=no", 我想运行一个--query ,它返回具有包含“foo=yes”的标签“Data”值的任何实例的InstanceId。 所以像

aws --region us-east-1 ec2 describe-instances --query 'Reservations[].Instances[].[?contains(Tags[?Key==`Data`].Value, `foo=yes` == `true`)].InstanceId'

但这不起作用。

guidance

最有用的评论

这当然是一个棘手的问题! 我用以下表达式管理它:

"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"

那篇文章很长,所以我要一块一块地分解它。 首先,让我们使用以下示例数据:

{
    "Reservations": [{"Instances": [
        {
            "InstanceId": "id-target1",
            "Tags": [
                {"Key": "Data", "Value": "foo=yes,bar=no"},
                {"Key": "Name", "Value": "target"}
            ]
        },
        {
            "InstanceId": "id-target2",
            "Tags": [
                {"Key": "Data", "Value": "foo=yes,bar=yes"},
                {"Key": "Name", "Value": "target"}
            ]
        },
        {
            "InstanceId": "id-invalid1",
            "Tags": [
                {"Key": "Data", "Value": "foo=no,bar=no"},
                {"Key": "Name", "Value": "invalid"}
            ]
        },
        {
            "InstanceId": "id-invalid2",
            "Tags": [
                {"Key": "Data", "Value": "foo=no,bar=yes"},
                {"Key": "Name", "Value": "invalid"}
            ]
        }
    ]}]
}

首先,我们想要获取实例列表,所以我们从Reservations[].Instances[]

[
  {
    "Tags": [
      {
        "Value": "foo=yes,bar=no",
        "Key": "Data"
      },
      {
        "Value": "target",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-target1"
  },
  {
    "Tags": [
      {
        "Value": "foo=yes,bar=yes",
        "Key": "Data"
      },
      {
        "Value": "target",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-target2"
  },
  {
    "Tags": [
      {
        "Value": "foo=no,bar=no",
        "Key": "Data"
      },
      {
        "Value": "invalid",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-invalid1"
  },
  {
    "Tags": [
      {
        "Value": "foo=no,bar=yes",
        "Key": "Data"
      },
      {
        "Value": "invalid",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-invalid2"
  }
]

现在我们想要具有值为“Data”的 Key 的标签: .Tags[?Key == 'Data']用于完整表达式Reservations[].Instances[].Tags[?Key == 'Data']和结果:

[
  [
    {
      "Value": "foo=yes,bar=no",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=yes,bar=yes",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=no,bar=no",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=no,bar=yes",
      "Key": "Data"
    }
  ]
]

现在我们还希望该标记的值包含“foo=yes”,因此我们为完整表达式Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]添加条件&& contains(Value, 'foo=yes') Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]和结果:

[
  [
    {
      "Value": "foo=yes,bar=no",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=yes,bar=yes",
      "Key": "Data"
    }
  ],
  [],
  []
]

好的,现在让我们用[]来展平该列表,以获得完整的表达式Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]和结果:

[
  {
    "Value": "foo=yes,bar=no",
    "Key": "Data"
  },
  {
    "Value": "foo=yes,bar=yes",
    "Key": "Data"
  }
]

好的,现在我们有了我们想要的标签,但是我们想要完整的实例数据。 因此,让我们将该标签过滤器移回实例上的过滤器。 所以完整的表达式现在是Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]]的结果:

[
  [
    {
      "Tags": [
        {
          "Value": "foo=yes,bar=no",
          "Key": "Data"
        },
        {
          "Value": "target",
          "Key": "Name"
        }
      ],
      "InstanceId": "id-target1"
    },
    {
      "Tags": [
        {
          "Value": "foo=yes,bar=yes",
          "Key": "Data"
        },
        {
          "Value": "target",
          "Key": "Name"
        }
      ],
      "InstanceId": "id-target2"
    }
  ]
]

再解释一下, ?正在检查一个真值。 对于那些没有正确标签的实例, ?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]将返回null ,一个假值。

现在剩下要做的就是展平该列表并为完整表达式"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"选择带有[].InstanceId的实例 ID 和结果:

[
  "id-target1",
  "id-target2"
]

我们完成了!

所有3条评论

这当然是一个棘手的问题! 我用以下表达式管理它:

"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"

那篇文章很长,所以我要一块一块地分解它。 首先,让我们使用以下示例数据:

{
    "Reservations": [{"Instances": [
        {
            "InstanceId": "id-target1",
            "Tags": [
                {"Key": "Data", "Value": "foo=yes,bar=no"},
                {"Key": "Name", "Value": "target"}
            ]
        },
        {
            "InstanceId": "id-target2",
            "Tags": [
                {"Key": "Data", "Value": "foo=yes,bar=yes"},
                {"Key": "Name", "Value": "target"}
            ]
        },
        {
            "InstanceId": "id-invalid1",
            "Tags": [
                {"Key": "Data", "Value": "foo=no,bar=no"},
                {"Key": "Name", "Value": "invalid"}
            ]
        },
        {
            "InstanceId": "id-invalid2",
            "Tags": [
                {"Key": "Data", "Value": "foo=no,bar=yes"},
                {"Key": "Name", "Value": "invalid"}
            ]
        }
    ]}]
}

首先,我们想要获取实例列表,所以我们从Reservations[].Instances[]

[
  {
    "Tags": [
      {
        "Value": "foo=yes,bar=no",
        "Key": "Data"
      },
      {
        "Value": "target",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-target1"
  },
  {
    "Tags": [
      {
        "Value": "foo=yes,bar=yes",
        "Key": "Data"
      },
      {
        "Value": "target",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-target2"
  },
  {
    "Tags": [
      {
        "Value": "foo=no,bar=no",
        "Key": "Data"
      },
      {
        "Value": "invalid",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-invalid1"
  },
  {
    "Tags": [
      {
        "Value": "foo=no,bar=yes",
        "Key": "Data"
      },
      {
        "Value": "invalid",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-invalid2"
  }
]

现在我们想要具有值为“Data”的 Key 的标签: .Tags[?Key == 'Data']用于完整表达式Reservations[].Instances[].Tags[?Key == 'Data']和结果:

[
  [
    {
      "Value": "foo=yes,bar=no",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=yes,bar=yes",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=no,bar=no",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=no,bar=yes",
      "Key": "Data"
    }
  ]
]

现在我们还希望该标记的值包含“foo=yes”,因此我们为完整表达式Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]添加条件&& contains(Value, 'foo=yes') Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]和结果:

[
  [
    {
      "Value": "foo=yes,bar=no",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=yes,bar=yes",
      "Key": "Data"
    }
  ],
  [],
  []
]

好的,现在让我们用[]来展平该列表,以获得完整的表达式Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]和结果:

[
  {
    "Value": "foo=yes,bar=no",
    "Key": "Data"
  },
  {
    "Value": "foo=yes,bar=yes",
    "Key": "Data"
  }
]

好的,现在我们有了我们想要的标签,但是我们想要完整的实例数据。 因此,让我们将该标签过滤器移回实例上的过滤器。 所以完整的表达式现在是Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]]的结果:

[
  [
    {
      "Tags": [
        {
          "Value": "foo=yes,bar=no",
          "Key": "Data"
        },
        {
          "Value": "target",
          "Key": "Name"
        }
      ],
      "InstanceId": "id-target1"
    },
    {
      "Tags": [
        {
          "Value": "foo=yes,bar=yes",
          "Key": "Data"
        },
        {
          "Value": "target",
          "Key": "Name"
        }
      ],
      "InstanceId": "id-target2"
    }
  ]
]

再解释一下, ?正在检查一个真值。 对于那些没有正确标签的实例, ?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]将返回null ,一个假值。

现在剩下要做的就是展平该列表并为完整表达式"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"选择带有[].InstanceId的实例 ID 和结果:

[
  "id-target1",
  "id-target2"
]

我们完成了!

哇,酷极了! Tags[?Key == 'Data' && contains(Value, 'foo=yes')]步骤是我出轨的地方。 谢谢!

* 更新 *

出于我的目的,以下是一种更简单的方法(这是我从访问 2 年前的帖子中获得的信息):

--filter "Name=tag:aws:cloudformation:stack-name,Values=*$1*"
* 原始信息 *

这似乎不再起作用。 它一直工作到最后一步,其中 [?Tags 被替换为 .Tags .. 当我为我的用例运行它时,我得到一个空集(成功获得我期望的结果后)
Reservations[].Instances[].Tags[?Key == 'aws:cloudformation:stack-name' && contains(Value, 'target')][]

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

ypant picture ypant  ·  3评论

alexejk picture alexejk  ·  3评论

vadimkim picture vadimkim  ·  3评论

kangman picture kangman  ·  3评论

rahul003 picture rahul003  ·  3评论