从命令行(cli)使用AWS EC2 describe-instances时无法按标签过滤

发布时间:2020-07-07 03:10

我目前正在尝试从命令行编写aws ec2查询(在AWS Linux中,这无关紧要)。我正在尝试设置一个与以下两个条件匹配的过滤器:

  1. 显示那些处于关闭状态(代码80)的实例,并且;
  2. 显示标签为“ ShortPurpose”且值为“ Fleet”的实例。

实际上发生的是,无论是否设置了标签“ ShortPurpose”:“ Fleet”,所有处于关闭状态的实例都将被返回。

我的实例设置如下:

+-------------+--------------+------------------------+--+
| Instance ID |     Tag      |       Tag Value        |  |
+-------------+--------------+------------------------+--+
| i-09876     | ShortPurpose | Fleet                  |  |
|             | Organisation | UmbrellaCorp           |  |
|             | Name         | cloud-01               |  |
|             | Owner        | ORG-UMBR-ELLA          |  |
|             | Purpose      | Cloud processing fleet |  |
+-------------+--------------+------------------------+--+
|             |              |                        |  |
| i-12345     |  (no tags)   |                        |  |
|             |              |                        |  |
+-------------+--------------+------------------------+--+

我正在使用的命令是:

aws ec2 describe-instances --query "Reservations[*].Instances[*].InstanceId" --filters "Name=tag:ShortPurpose,Values=Fleet,Name=instance-state-code,Values=80"

结果是标准数组样式响应。实例状态已成功过滤,但没有成功过滤标签。

回答1

我试图验证您的命令,并且在您编写该命令时会产生错误

Error parsing parameter '--filters': Second instance of key "Name" encountered for input:
Name=tag:ShortPurpose,Values=Fleet,Name=instance-state-code,Values=80
                                   ^
This is often because there is a preceeding "," instead of a space.

但是,我能够在沙箱实例上成功使用,如下所示:

aws ec2 describe-instances \
     --query "Reservations[*].Instances[*].InstanceId" \
     --filters Name=tag:ShortPurpose,Values=Fleet Name=instance-state-code,Values=80
回答2

在一个示例中,我发现AWS重复使用了错误的查询格式。正确的查询是:

aws ec2 describe-instances --query "Reservations[*].Instances[*].InstanceId" --filters "Name=tag-value,Values=Fleet" "Name=instance-state-code,Values=80"

请注意,我忽略了ShortPurpose标记,而是直接寻找该值,该值可能存在于任何标记中。