首页 > 解决方案 > JMESPath 在树中下降以进行过滤

问题描述

我想要达到的目标

我想使用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==RootDeviceName].Ebs.VolumeId, Test: RootDeviceName}'

什么不工作

几件事:

  1. Ebs.VolumeId不是 的直系后裔DeviceName,是的后裔BlockDeviceMappings
  2. RootDeviceName不是 的后代BlockDeviceMappings

因此,当我尝试拉动RootDeviceName并相应地搜索时VolumeId,我得到一个空白字段(块:用于测试,与案例无关)。

前 2 个字段是正确的。

提前致谢!

标签: amazon-web-servicesamazon-ec2jmespath

解决方案


是的,这是一个相当大的问题!

我最接近的工作是指定实际值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'])

推荐阅读