【问题标题】:Listing instance name among other data with aws-cli 1.3.6使用 aws-cli 1.3.6 在其他数据中列出实例名称
【发布时间】: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


【解决方案1】:

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

您对这个问题的表述方式实际上暗示了解决方案,即Pipe Expressions(不过,仅在aws-cli 的1.3.7 版中可用,因此在提问时无法弄清楚):

pipe-expression  = expression "|" expression

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

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

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

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

foo[*].bar[0] -> ["first1", "first2"]
foo[*].bar | [0] -> ["first1", "second1"]

解决方案

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

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

----------------------------------
|        DescribeInstances       |
+--------------------+-----------+
|  Name1             |  stopped  |
|  Name2             |  stopped  |
+--------------------+-----------+

【讨论】:

  • @c-garcia - 刚刚意识到底层的JEP-4: Pipe Expressions 只是merged as of April 15,因此需要aws-cli 1.3.7,所以你很难弄清楚这个问你的问题时;) - 我已经相应地更新了答案。
  • 感谢您的友好和准确的回答。用 1.3.8 测试(刚刚更新了包)并按预期工作!
  • @Steffen,很好的例子 .. 帮助我解决了我一直在努力解决的问题。谢谢。现在,更好的是给出一个查询多个标签的示例。即,就像上面一样,但包括另一个将显示另一个标签的列,比如 Tags[?Key==`Project\']。
  • TLDR 是:Tags[?Key==`Name`]|[0].Value]
  • 太棒了!正是我想要的。谢谢@SteffenOpel
【解决方案2】:

它告诉实例 ID 以及服务器状态

Command:
aws ec2 describe-instances --filter Name=tag:Name,Values=eep --query 'Reservations[*].Instances[*].{id:State,ID:InstanceId}' --output table

Query part in the above command
It changes as per the requirement
--query 'Reservations[*].Instances[*].{id:State,ID:InstanceId}' --output table

【讨论】:

    【解决方案3】:
    #!/bin/bash
    for r in `aws ec2 describe-regions --query Regions[*].RegionName --output text`
    do
    
        #echo $r
        aws ec2 describe-instances --region $r --query 'Reservations[*].Instances[*].{ID:InstanceId, type:InstanceType, launched:LaunchTime, name:Tags[?Key==`Name`].Value[]}' --output json | jq --arg R $r -r '.[] | .[] | [$R, .ID, .type, .launched, .name[0]] | @csv'
    
    done
    

    输出:

    "us-east-1","i-054f8253b9ed0746d","t2.micro","2018-10-31T01:57:52.000Z","xxx"
    "us-east-1","i-0638792b8b3057ce2","t2.nano","2018-10-23T03:49:24.000Z","yyy"
    

    【讨论】:

      猜你喜欢
      • 2017-07-12
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 2021-09-03
      • 2017-06-06
      • 1970-01-01
      相关资源
      最近更新 更多