JMESPath 在树中下降以进行过滤
JMESPath descend in tree for filter
我想要实现的目标
我想使用 describe-instances
提取根块设备的卷 ID。
到目前为止我尝试了什么
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}'
什么不起作用
几件事:
Ebs.VolumeId
不是 DeviceName
的直接后代,而是 BlockDeviceMappings
. 的后代
RootDeviceName
不是 BlockDeviceMappings
的后代。
因此,当我尝试拉取 RootDeviceName
并相应地搜索 VolumeId
时,我得到一个空白字段(块:用于测试,与案例无关)。
前两个字段是正确的。
提前致谢!
是的,这是一个很好的问题!
我最接近的工作是指定 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'])
我想要实现的目标
我想使用 describe-instances
提取根块设备的卷 ID。
到目前为止我尝试了什么
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}'
什么不起作用
几件事:
Ebs.VolumeId
不是DeviceName
的直接后代,而是BlockDeviceMappings
. 的后代
RootDeviceName
不是BlockDeviceMappings
的后代。
因此,当我尝试拉取 RootDeviceName
并相应地搜索 VolumeId
时,我得到一个空白字段(块:用于测试,与案例无关)。
前两个字段是正确的。
提前致谢!
是的,这是一个很好的问题!
我最接近的工作是指定 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'])