amazon-web-services - 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}'
什么不工作
几件事:
Ebs.VolumeId
不是 的直系后裔DeviceName
,是的后裔BlockDeviceMappings
。RootDeviceName
不是 的后代BlockDeviceMappings
。
因此,当我尝试拉动RootDeviceName
并相应地搜索时VolumeId
,我得到一个空白字段(块:用于测试,与案例无关)。
前 2 个字段是正确的。
提前致谢!
解决方案
是的,这是一个相当大的问题!
我最接近的工作是指定实际值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'])
推荐阅读
- pyspark - 如何为每个任务(分区)执行一些功能以及为分区中的每个元素执行一些功能?
- php - Curl - 无法检索隐藏的输入字段值
- python - 需要帮助在 Python 中使用 sympy 绘制和查找局部最大值和最小值。第一部分有效,但不知道如何做其他部分
- reactjs - 无法获得未定义的属性“绑定”。Babel 7 + core-js + IE11
- node.js - 从另一个js脚本调用方法时如何处理node-mysql上的数据库延迟
- reporting-services - 使用查找和排除空白和空值的 SQL Server 报表生成器
- sql - 根据日期 BigQuery 将年龄加一岁
- java - 在Java中将布尔信息从一个类传递到另一个类
- r - 在将数据分组到 ggplot 之前添加 geom_smooth()
- php - Wordpress 插件代码是否对公众开放