如何通过单次AWS CLI调用查询pending、running状态EC2实例总数
解决方案
完全可以通过单次API请求完成统计,不需要发起两次调用。AWS EC2的instance-state-name过滤器原生支持多值匹配,传入多个状态值时会自动返回处于任意一个指定状态的实例,天然覆盖你需要的pending和running两个筛选范围。
适配原有使用习惯的合并命令
如果你习惯用wc -l做行统计,可以直接把两个状态值合并到同一个过滤器的Values列表中,命令如下:
aws ec2 describe-instances \ --filters Name=instance-state-name,Values="running","pending" \ --query 'Reservations[*].Instances[*].[InstanceId]' \ --output text \ | wc -l
这个命令和你之前两次执行命令再求和的结果完全一致,但只会向AWS发起一次服务请求,执行速度提升明显。
更高效的无管道统计写法
你还可以直接利用JMESPath(也就是AWS CLI --query 参数使用的查询语法)内置的length函数,直接在查询阶段返回实例总数,不需要管道调用wc:
aws ec2 describe-instances \ --filters Name=instance-state-name,Values="running","pending" \ --query 'length(Reservations[].Instances[])' \ --output text
这个写法相比管道统计的版本有两个明显优势:
- 不依赖
wc命令,在Windows、macOS、Linux不同环境下都可以直接运行,不需要额外适配shell工具 - 不需要把所有实例ID输出为文本流再做统计,CLI直接在本地对返回的结构化数据做计数,数据传输和处理开销更小
补充说明
- AWS CLI默认开启自动分页,即使你账号下符合条件的实例数量超过单次接口返回的1000条上限,也会自动拉取全量结果后再统计,不会出现计数遗漏
- 不要给过滤器传重复的
Name=instance-state-name规则,多值匹配直接把所有目标状态写到同一个过滤器的Values里即可
内容的提问来源于stack exchange,提问作者FintleWoodle
相关产品推荐
相关产品推荐

