tfsec自定义GCP Cloud SQL检查报错:MatchSpec格式解析失败
解决tfsec自定义检查反序列化错误:无法将!!map反序列化为[]custom.MatchSpec
问题根源
你遇到的错误是因为tfsec自定义检查的YAML配置中,matchSpec字段格式不符合要求——它必须是数组类型,但你写成了单个map对象。tfsec尝试解析时无法将单个map转换成预期的[]custom.MatchSpec(匹配规则数组),因此抛出序列化错误。
修复后的自定义检查YAML
针对GCP Cloud SQL实例禁用远程访问的需求,正确的自定义检查配置如下:
--- checks: - code: CUSTOM_GCP_SQL_REMOTE_ACCESS_OFF description: "确保Cloud SQL实例禁用远程访问(public_ip_enabled = false)" requiredTypes: - resource requiredLabels: - google_sql_database_instance severity: ERROR matchSpec: - name: "settings.ip_configuration.public_ip_enabled" op: eq value: false
关键修正点
matchSpec必须是数组:哪怕只有一条匹配规则,也要用-开头定义为数组元素,不能直接写map结构。- 路径匹配:直接通过
settings.ip_configuration.public_ip_enabled定位目标字段即可,因为google_sql_database_instance的settings是单个对象,无需使用subMatch。
验证示例
- 合规的Terraform代码示例:
resource "google_sql_database_instance" "compliant_db" { name = "compliant-db" database_version = "POSTGRES_14" region = "us-central1" settings { tier = "db-f1-micro" ip_configuration { public_ip_enabled = false # 符合检查要求 } } }
- 运行
tfsec .,该实例不会触发自定义检查错误;若将public_ip_enabled改为true,则会触发CUSTOM_GCP_SQL_REMOTE_ACCESS_OFF的错误提示。
关于subMatch的正确用法(嵌套列表场景)
如果目标字段嵌套在列表类型的属性中(比如部分资源的settings是列表),才需要用到subMatch,格式同样要遵循数组要求:
matchSpec: - name: "settings" subMatch: - name: "ip_configuration.public_ip_enabled" op: eq value: false
内容的提问来源于stack exchange,提问作者Carl L
相关产品推荐
相关产品推荐

