【问题标题】:Reference Parent Element in JMESPath Filter ExpressionJMESPath 过滤器表达式中的引用父元素
【发布时间】:2015-02-23 12:23:03
【问题描述】:

我有以下 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                |
+------------+------------------+----------------------+

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

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

是我遗漏了什么还是这仅仅是 JMESPath 语法的限制?

【问题讨论】:

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


    【解决方案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 ]
             ]
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您澄清这一点。是否有任何关于修改这部分规范的建议?
      • @jamesls 现在 2018 年还是这样吗?
      猜你喜欢
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多