AWS CLI的--query与--filter新手问题:EC2查询及标识符疑问
AWS CLI EC2 查询问题解答
问题1:获取运行中EC2实例主机名的正确写法
EC2实例的“主机名”分两种场景,对应不同的查询路径:
- 默认私有DNS主机名:AWS自动分配的私有DNS(比如
ip-10-0-0-1.us-west-2.compute.internal),直接调用顶层字段PrivateDnsName即可:
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" --query 'Reservations[*].Instances[*].{InstanceId:InstanceId, Hostname:PrivateDnsName}' --output table
- 自定义Hostname标签:如果是自己给实例加了
Hostname标签,需要用JMESPath过滤标签列表提取对应值:
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" --query 'Reservations[*].Instances[*].{InstanceId:InstanceId, Hostname:Tags[?Key==`Hostname`].Value | [0]}' --output table
之前显示None是因为你指定的Hostname不是EC2实例的顶层字段,必须匹配JSON返回结构里的合法路径。
问题2:InstanceId总览列表与自定义查询列写法规范
InstanceId总览列表
直接用--query只提取InstanceId字段即可,输出选text格式方便查看:
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" --query 'Reservations[*].Instances[*].InstanceId' --output text
如果要包含所有状态的实例,去掉--filters参数即可。
自定义查询列的写法规范
冒号右侧必须是EC2实例JSON返回结构中的合法JMESPath路径:
- 顶层字段(比如InstanceId、InstanceType、PublicIpAddress)直接写字段名即可,示例:
{InstanceId:InstanceId, Type:InstanceType} - 嵌套字段(比如标签、网络接口)要写完整路径,示例:提取
Name标签用Tags[?Key==Name].Value | [0] - 避免
None的小技巧:如果字段可能不存在,可以用||设置默认值,比如没有Hostname标签时显示N/A:
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" --query 'Reservations[*].Instances[*].{InstanceId:InstanceId, Hostname:Tags[?Key==`Hostname`].Value | [0] || `N/A`}' --output table
路径错误或者目标字段不存在时会返回None,可以先不加--query执行aws ec2 describe-instances查看完整JSON结构,确认路径正确性。
内容的提问来源于stack exchange,提问作者01Tech
相关产品推荐
相关产品推荐

