JMESPath спуститься в дерево для фильтра - PullRequest
0 голосов
/ 27 декабря 2018

Чего я пытаюсь достичь

Я хочу извлечь идентификатор тома для корневого блочного устройства, используя describe-instances.

Что я пытался до сих пор

aws ec2 describe-instances --filters "Name=tag:Backup,Values=True" --query 'Reservations[].Instances[].{Name: Tags[?Key==`Name`].Value | [0], Id: InstanceId, Block: BlockDeviceMappings[?DeviceName==<strong>RootDeviceName</strong>].Ebs.VolumeId, Test: RootDeviceName}'

Что не работает

Несколько вещей:

  1. Ebs.VolumeId не является прямым потомком DeviceName, оно происходит от BlockDeviceMappings.
  2. RootDeviceName не является потомком BlockDeviceMappings.

Так что, когда я пытаюсь вытащить RootDeviceName и соответственно искать VolumeId, яполучение пустого поля (Блок: для тестирования и не имеет отношения к делу).

Первые 2 поля верны.

Заранее спасибо!

1 Ответ

0 голосов
/ 28 декабря 2018

Да, это просто вопрос!

Самое близкое, что я получил, - это указать фактическое значение для DeviceName:

aws ec2 describe-instances --query 'Reservations[].Instances[].[InstanceId, BlockDeviceMappings[?DeviceName==`/dev/xvda`].Ebs.VolumeId]'

(этот синтаксис работал на Mac.)

Честно говоря, я бы рекомендовал использовать язык для вызова (например, Python), а затем применить свою собственную логику, а не пытаться убедить JMESPath извлечь правильные значения.

Этобудет что-то вроде этого:

import boto3

ec2_client = boto3.client('ec2', region_name = 'ap-southeast-2')

response = ec2_client.describe_instances(
    Filters=[
        {
            'Name': 'tag:Backup',
            'Values': ['True']
        }
    ]
)

for r in response['Reservations']:
    for i in r['Instances']:
        name = [t['Value'] for t in i['Tags'] if t['Key'] == 'Name'][0]
        for b in i['BlockDeviceMappings']:
            if b['DeviceName'] == i['RootDeviceName']:
                print (i['InstanceId'], name, b['Ebs']['VolumeId'])
...