JMESPath过滤器表达式中的引用父元素

时间:2015-02-23 12:23:04

标签: amazon-web-services aws-cli jmespath

我有以下JMESPath查询

query="Reservations[].Instances[].{ \
    InstanceId: InstanceId, \
    RootDeviceVolumeId: BlockDeviceMappings[?DeviceName==\`/dev/sda1\`] \
       | [].Ebs.VolumeId | [0], \
    RootDeviceName: RootDeviceName \
}"

aws ec2 describe-instances --query $query

给出这样的输出

+------------+------------------+----------------------+
| InstanceId | RootDeviceName   | RootDeviceVolumeId   |
+------------+------------------+----------------------+
|  i-12345678|  /dev/sda1       |  vol-abcdef12        |
|  i-98765432|  /dev/sda1       |  vol-ef123456        |
|  i-23456789|  /dev/sda1       |  vol-fedcba09        |
|  i-aabbccdd|  /dev/xvda       |  None                |
+------------+------------------+----------------------+

我想找到一种方法来引用RootDeviceName过滤器表达式中的BlockDeviceMappings,而不是硬编码/dev/sda1设备名称,因为有时它是{{1} } 例如。但是,我找不到在过滤器表达式中引用父元素的方法。

另一种选择是将/dev/xvdaRootDeviceName映射到所有设备的投影上,然后将其传递给过滤器表达式,但语法似乎不支持在投影中包含父元素任

我是否遗漏了某些内容,或者这只是JMESPath语法的限制?

2 个答案:

答案 0 :(得分:4)

我们需要一些允许你绑定范围的机制,这是目前尚无法实现的。我很想添加这个。现在你必须使用替代工具。

答案 1 :(得分:0)

如果你愿意为你的JMESPath使用python代码添加自定义函数,那么就会有一种肮脏而丑陋的方式来做类似的事情。它确实违反了“功能应该没有副作用”的规则。这是要点:https://gist.github.com/martinvirtel/366235401cf7fbec503d53eb44109f25

gist中的fetchstore.py文件向JMESPath添加了一个fetch和store函数。请参阅下面的测试或示例,了解其工作原理。以下是有关如何使用Python项目向JMESPath添加函数的指导:https://pypi.python.org/pypi/jmespath#custom-functions

输入:

 { "name" : "parent name",
    "data" : [
        { "x" : 1, "y" : 2 },
        { "x" : 3, "y" : 2 }
        ]
    }

JMESPath Expression:

{ 
  name: store(name,'parent_name_attribute'), 
  data: data[][ fetch('parent_name_attribute'),x, y] 
}

结果:

{
 "name": "parent name",
 "data": [
           [ "parent name", 1, 2 ],
           [ "parent name", 3, 2 ]
         ]
}