Да, это просто вопрос!
Самое близкое, что я получил, - это указать фактическое значение для 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'])