使用aws-cli 1.3.6在其他数据中列出实例名称

c-g*_*cia 28 amazon-ec2 amazon-web-services aws-cli jmespath

使用aws-cli 1.3.6我试图用名称和状态获得一个简单的ec2实例表.我一直在查看--query和JMESpath文档,我已经能够选择Map的"Value"项,其中"Key"项等于Name.这对于获取实例名称很有用.因此,下面的代码似乎工作

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value'
Run Code Online (Sandbox Code Playgroud)

并提供这个:

-------------------
|DescribeInstances|
+-----------------+
|  Name1          |
|  Name2          |
+-----------------+
Run Code Online (Sandbox Code Playgroud)

但是,如果我想添加状态,事情就会像我预期的那样得到.运用

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value,State.Name]'
Run Code Online (Sandbox Code Playgroud)

提供

-------------------
|DescribeInstances|
+-----------------+
|  Name1          |
|  stopped        |
|  Name2          |
|  stopped        |
+-----------------+
Run Code Online (Sandbox Code Playgroud)

而不是具有名称和状态的两列表.

如果我们将输出转换为JSON,我们可以看到Tags选项返回一个列表(单元素列表),这可能是问题所在:

[
    [
        [
            "Name1"
        ],
        "stopped"
    ],
    [
        [
            "Name2"
        ],
        "stopped"
    ]
]
Run Code Online (Sandbox Code Playgroud)

我无法通过选择第一个元素将此列表转换为标量.这个,不起作用.返回一个空列表作为名称.

aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[0],State.Name]'
Run Code Online (Sandbox Code Playgroud)

和此一样

aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[][0],State.Name]'
Run Code Online (Sandbox Code Playgroud)

我解决这个问题的唯一方法是通过join函数.因为我只期待一个元素,所以可以,但我似乎有点hacky.

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[join(`,`,Tags[?Key==`Name`].Value),State.Name]'

---------------------------
|    DescribeInstances    |
+-------------+-----------+
|  Name1      |  stopped  |
|  Name2      |  stopped  |
+-------------+-----------+
Run Code Online (Sandbox Code Playgroud)

因此,问题是:是否有任何方法可以选择过滤器结果的第一个元素,因为(?Key==XXXX)它后缀[0]似乎不起作用?

提前致谢!

Ste*_*pel 26

因此,问题是:有没有办法选择过滤器结果的第一个元素(?键== XXXX),记住用[0]后缀它似乎不起作用?

你提出这个问题的方式实际上暗示了解决方案,即管道表达式(仅适用于aws-cli的 1.3.7版本,因此无法在提问时弄清楚):

pipe-expression  = expression "|" expression
Run Code Online (Sandbox Code Playgroud)

管道表达式组合了两个表达式,由|分隔 字符.它类似于具有两个重要区别的子表达式:

  1. 任何表达都可以在右侧使用.子表达式限制可以在右侧使用的表达式类型.
  2. 管道表达式停止左侧的投影以传播到右侧.如果左表达式创建投影,则它不适用于右侧.

强调部分是关键,如后续示例所示,特别是:

如果您只想要第一个子列表["first1","second1"],则可以使用管道表达式:

foo[*].bar[0] -> ["first1", "first2"]
foo[*].bar | [0] -> ["first1", "second1"]
Run Code Online (Sandbox Code Playgroud)

因此,应用管道表达式会产生所需的结果:

aws ec2 describe-instances --output table \
  --query 'Reservations[].Instances[].[Tags[?Key==`Name`] | [0].Value, State.Name]'

----------------------------------
|        DescribeInstances       |
+--------------------+-----------+
|  Name1             |  stopped  |
|  Name2             |  stopped  |
+--------------------+-----------+
Run Code Online (Sandbox Code Playgroud)

  • TLDR是:`标签[?Key == \`Name \`] | [0] .Value]` (4认同)