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

Conftest Verify意外通过:规则未触发预期失败问题排查

问题

运行conftest verify时,尽管规则本应在db.storage_encrypted != true的场景下触发失败,但结果却显示通过。相关代码如下:

# deny.rego
deny_unencrypted[msg] {
  db := input.resource.aws_db_instance[x]
  db.storage_encrypted != true # 预期此处触发失败
  msg = sprintf("RDS `%v` has unencrypted storage", [x])
}

# deny_test.rego
test_unencrypted {
  cfg := parse_config("hcl2", `
    resource "aws_db_instance" "default" {
      storage_encrypted = true
    }
  `)

   deny_unencrypted with input as cfg
}
分析与解决

问题根源在于测试用例逻辑错误,同时规则的严谨性不足,具体修正点如下:

  • 测试用例逻辑完全写反
    当前测试用例配置了storage_encrypted = true,此时规则中db.storage_encrypted != true的条件不成立,deny_unencrypted不会生成任何结果,测试test_unencrypted会直接失败。你需要把测试用例中的storage_encrypted设为false,或者直接删除该字段,来验证规则是否正确触发:

    # 修正后的 deny_test.rego
    test_unencrypted {
      cfg := parse_config("hcl2", `
        resource "aws_db_instance" "default" {
          storage_encrypted = false
        }
      `)
    
       deny_unencrypted with input as cfg
    }
    

    也可以测试未配置该字段的场景:

    test_unencrypted_missing {
      cfg := parse_config("hcl2", `
        resource "aws_db_instance" "default" {
          engine = "mysql"
          instance_class = "db.t3.micro"
        }
      `)
    
       deny_unencrypted with input as cfg
    }
    
  • 规则补充未配置字段的处理
    如果Terraform配置中完全没有设置storage_encrypted字段,db.storage_encrypted的值会是undefined,此时db.storage_encrypted != true的判断在Rego中成立,但为了更严谨,建议显式覆盖这种场景:

    # 修正后的 deny.rego
    deny_unencrypted[msg] {
      db := input.resource.aws_db_instance[x]
      not db.storage_encrypted == true # 同时覆盖未设置和设置为false的情况
      msg = sprintf("RDS `%v` has unencrypted storage", [x])
    }
    
  • 确认conftest扫描路径
    运行conftest verify时,确保指定了正确的Terraform配置文件路径,比如conftest verify ./terraform,否则conftest可能未扫描到目标资源,导致规则未触发。

内容的提问来源于stack exchange,提问作者Gerald

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:52:38