如何用JMESPath查询筛选90天以上的EC2实例并返回指定字段
筛选创建超90天的EC2实例(含ID、启动时间、Name标签)
直接可用的命令
不用混用aws cli和jq,一条纯JMESPath查询就能搞定:
aws ec2 describe-instances \ --query "Reservations[].Instances[?LaunchTime<='$(date --date='-90 days' '+%Y-%m-%d')' && Tags[?Key=='Name']].[InstanceId, LaunchTime, Tags[?Key=='Name'].Value|[0]]" \ --output text
输出效果
i-0d1b4afee437442a4 2023-02-25T03:17:00+00:00 MDM-server-01
命令拆解
实例筛选:
LaunchTime<='$(date ...)':只保留启动时间早于90天前的实例&& Tags[?Key=='Name']:额外过滤出带有Name标签的实例(不需要强制过滤的话可以删掉这部分)
字段提取:
InstanceId, LaunchTime:直接提取实例ID和启动时间Tags[?Key=='Name'].Value|[0]:先筛选出Key为Name的标签,提取其Value,再用|[0]把数组转成单个字符串(避免返回嵌套数组)
你之前命令的问题
- 第一个jq命令:AWS返回的实例数据里没有
.Name字段,Name标签存在Tags数组中,所以.Name会返回空值,导致输出里标签位置空白。 - 第二个JMESPath命令:
Tags[?Key=='Name'].Value本身是数组格式,再加上外层的嵌套索引,最终得到二维数组。添加|[0]就能直接拿到单个标签值。
可选:兼容无Name标签的实例
如果要保留没有Name标签的实例,用N/A填充标签位置,使用这条命令:
aws ec2 describe-instances \ --query "Reservations[].Instances[?LaunchTime<='$(date --date='-90 days' '+%Y-%m-%d')'].[InstanceId, LaunchTime, (Tags[?Key=='Name'].Value|[0] || 'N/A')]" \ --output text
内容的提问来源于stack exchange,提问作者Michael Mauney
相关产品推荐
相关产品推荐

