Ссылочный родительский элемент в выражении фильтра 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 имя устройства, так как иногда это /dev/xvda например. Однако я не могу найти способ ссылаться на родительский элемент в выражении фильтра.

Другим вариантом будет сопоставление RootDeviceName а также InstanceId на проекцию всех устройств, а затем направить ее в выражение фильтра, но синтаксис, по-видимому, также не поддерживает включение родительских элементов в проекции.

Я что-то упустил или это просто ограничение синтаксиса JMESPath?

2 ответа

Решение

Нам понадобится какой-то механизм, который позволит вам связать область видимости, что сейчас невозможно... пока. Я очень заинтересован в добавлении этого. На данный момент вам придется использовать альтернативный инструмент.

Если вы хотите добавить пользовательские функции в код Python, использующий JMESPath, есть грязный и уродливый способ сделать что-то подобное. Это нарушает правило "у функций не должно быть побочных эффектов". Вот суть: https://gist.github.com/martinvirtel/366235401cf7fbec503d53eb44109f25

Файл fetchstore.py в gist добавляет выборку и функцию сохранения в JMESPath. Смотрите тест или пример ниже, чтобы узнать, как это работает. Вот руководство по добавлению функций в ваш проект Python, использующий JMESPath: https://pypi.python.org/pypi/jmespath.

Входные данные:

 { "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 ]
         ]
}
Другие вопросы по тегам