You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找标签值不符合规范的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]'

命令说明

  1. flatten:将嵌套的实例数组展开为一维数组,方便后续处理
  2. map(...):为每个实例对象添加account_id和backup_policy的直接属性,避免重复遍历标签数组
  3. select(...):根据账户类型筛选出标签值不符合要求的实例:
    • 生产环境账户(需替换生产环境账户标识规则为实际的account_id匹配规则,比如特定前缀/后缀)的backup_policy不是指定生产值
    • 非生产环境账户(替换非生产环境账户标识规则)的backup_policy不是指定非生产值
  4. 最后提取出需要的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:42:50