Ссылочный родительский элемент в выражении фильтра 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 ]
]
}