3

我有以下 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在过滤器表达式中引用 from的方法,BlockDeviceMappings而不是硬编码/dev/sda1设备名称,因为有时是/dev/xvda这样。但是,我找不到在过滤器表达式中引用父元素的方法。

另一种选择是将RootDeviceNameand映射InstanceId到所有设备的投影上,然后将其通过管道传输到过滤器表达式,但语法似乎也不支持在投影中包含父元素。

我是否遗漏了什么,或者这仅仅是 JMESPath 语法的限制?

4

2 回答 2

4

我们需要一些机制来允许您绑定范围,这是目前还不可能的事情...... 我对添加这个非常感兴趣。现在,您必须使用替代工具。

于 2015-02-23T18:59:29.980 回答
1

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

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

输入:

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

JMESPath 表达式:

{ 
  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 ]
         ]
}
于 2017-11-07T18:14:38.743 回答