【发布时间】:2014-05-18 02:37:32
【问题描述】:
使用 aws-cli 1.3.6 我正在尝试获取我的 ec2 实例的简单表,其中包含名称和状态。我一直在查看 --query 和 JMESpath 文档,并且能够选择 Map 的“值”项,其中“键”项等于名称。这对于获取实例名称很有用。因此,下面的代码似乎可以工作
aws ec2 describe-instances --output table --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value'
并提供这个:
-------------------
|DescribeInstances|
+-----------------+
| Name1 |
| Name2 |
+-----------------+
但是,如果我想添加状态,事情就不会像我预期的那样。使用
aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value,State.Name]'
交付
-------------------
|DescribeInstances|
+-----------------+
| Name1 |
| stopped |
| Name2 |
| stopped |
+-----------------+
而不是带有名称和状态的两列表。
如果我们将输出转换为 JSON,我们可以看到标签选择返回一个列表(单元素列表),这可能就是问题所在:
[
[
[
"Name1"
],
"stopped"
],
[
[
"Name2"
],
"stopped"
]
]
我无法通过选择第一个元素将此列表转换为标量。这,行不通。返回一个空列表作为名称。
aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[0],State.Name]'
和这个一样
aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[][0],State.Name]'
我想出解决这个问题的唯一方法是通过 join 函数。因为我只期望一个元素,所以没关系,但我似乎有点 hacky。
aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[join(`,`,Tags[?Key==`Name`].Value),State.Name]'
---------------------------
| DescribeInstances |
+-------------+-----------+
| Name1 | stopped |
| Name2 | stopped |
+-------------+-----------+
因此,问题是:是否有任何方法可以选择过滤器 (?Key==XXXX) 的结果的第一个元素,记住以 [0] 为后缀似乎不起作用?
提前致谢!
【问题讨论】:
-
我正在尝试做类似的事情,除了我想列出相关的安全组。但是,每当我尝试使用 join() 时,都会得到一个“非法令牌值”,包括当我粘贴上面的示例时。令人沮丧。
-
@MikeThomas - 虽然这并不能解释您所面临的问题,但您可能需要研究从 aws-cli 1.3.7 开始提供的新 Pipe Expressions,这可能有助于实现您的目标通过不同的方法,请参阅my answer 了解详情。
标签: amazon-web-services amazon-ec2 aws-cli jmespath