如何查找标签值不符合规范的EC2实例(CLI/JQ实现)
查找EC2实例中备份标签不符合要求的资源
需求说明
我的EC2实例均带有backup_policy标签:
- 生产环境账户的标签值必须为
EC2_Prod_Daily_Weekly_Monthly - 非生产环境账户的标签值必须为
EC2_NonProd_Daily_Weekly_Monthly
但存在生产环境错误使用非生产备份标签的情况,需要查询出所有标签值不符合要求的实例,获取以下信息:
InstanceId- 错误的
backup_policy标签值 account_id标签值
已尝试的命令
缺失backup_policy标签的查询命令
aws ec2 describe-instances --query 'Reservations[].Instances[?!contains(Tags[].Key, backup_policy)][].InstanceId'
查询标签符合要求的实例命令
aws ec2 describe-instances --filters Name=tag:backup_policy,Values=EC2_Prod_Daily_Weekly_Monthly --query 'Reservations[].Instances[?contains(Tags[].Key, backup_policy)].[InstanceId,Tags[?Key==Name].Value | [0],Tags[?Key==backup_policy].Value | [0]]' --output text
未达预期的jq命令示例
aws ec2 describe-instances \ --query 'Reservations[*].Instances[*].{InstanceId: InstanceId, Tags: Tags}' \ --output json | jq 'map(select(all(.Tags[]; .Key != "backup_policy" or .Value | contains("EC2_Prod_Daily_Weekly_Monthly") | not)))'
解决方案:正确的jq查询命令
使用以下命令可以筛选出标签值不符合要求的实例,并提取所需信息:
aws ec2 describe-instances \ --query 'Reservations[*].Instances[*].{InstanceId: InstanceId, Tags: Tags}' \ --output json | jq 'flatten | map( . + { account_id: (.Tags[] | select(.Key == "account_id").Value), backup_policy: (.Tags[] | select(.Key == "backup_policy").Value) } ) | select( (.account_id | test("生产环境账户标识规则")) and (.backup_policy != "EC2_Prod_Daily_Weekly_Monthly") or (.account_id | test("非生产环境账户标识规则")) and (.backup_policy != "EC2_NonProd_Daily_Weekly_Monthly") ) | [.InstanceId, .backup_policy, .account_id]'
命令说明
flatten:将嵌套的实例数组展开为一维数组,方便后续处理map(...):为每个实例对象添加account_id和backup_policy的直接属性,避免重复遍历标签数组select(...):根据账户类型筛选出标签值不符合要求的实例:- 生产环境账户(需替换
生产环境账户标识规则为实际的account_id匹配规则,比如特定前缀/后缀)的backup_policy不是指定生产值 - 非生产环境账户(替换
非生产环境账户标识规则)的backup_policy不是指定非生产值
- 生产环境账户(需替换
- 最后提取出需要的
InstanceId、错误的标签值、account_id
示例解析
针对给定的测试JSON:
[ { "InstanceId": "i-03226b321aaff1122", "Tags": [ { "Key": "account_id", "Value": "1231231231" }, { "Key": "backup_policy", "Value": "EC2_Prod_Daily_Weekly_Monthly-oldvalue" } ] } ]
假设1231231231是生产环境账户ID,命令会识别出其backup_policy值不符合要求,输出结果为:
[ "i-03226b321aaff1122", "EC2_Prod_Daily_Weekly_Monthly-oldvalue", "1231231231" ]
简化版本(如果账户类型可通过标签直接区分)
如果有专门的环境标签(比如environment: prod/non-prod),可以替换account_id的判断逻辑,让命令更直观:
aws ec2 describe-instances \ --query 'Reservations[*].Instances[*].{InstanceId: InstanceId, Tags: Tags}' \ --output json | jq 'flatten | map( . + { env: (.Tags[] | select(.Key == "environment").Value), backup_policy: (.Tags[] | select(.Key == "backup_policy").Value), account_id: (.Tags[] | select(.Key == "account_id").Value) } ) | select( (.env == "prod" and .backup_policy != "EC2_Prod_Daily_Weekly_Monthly") or (.env == "non-prod" and .backup_policy != "EC2_NonProd_Daily_Weekly_Monthly") ) | [.InstanceId, .backup_policy, .account_id]'
内容的提问来源于stack exchange,提问作者dbbloke
相关产品推荐
相关产品推荐

