如何在Terraform数据源中使用通配符创建过滤器?是否可行?
Terraform OCI数据源过滤器的通配符与正则使用说明
核心结论
Terraform OCI数据源的默认过滤器不支持*这类通配符,你当前的写法会将*当作字面量字符串进行精确匹配,因此无法找到目标资源,返回空结果。而使用正则表达式是官方支持的合规方式,只要正确配置就能实现前缀/模糊匹配。
问题原因分析
你的代码中,filter块默认regex = false(可从输出结果里看到该参数值),此时values中的内容会被当作精确匹配的字符串。也就是说,Terraform会去寻找display_name完全等于vcn-spoke*的VCN,而不是前缀为vcn-spoke的VCN,自然找不到匹配项。
正确实现方式:开启正则匹配
要实现前缀匹配,只需在filter块中添加regex = true,并使用正则表达式编写匹配规则。针对你的场景,匹配以vcn-spoke开头的display_name,可以用^锚定字符串起始位置:
variable vcn_prefix { default = "vcn-spoke" } data "oci_core_vcns" "spoke_vcns" { compartment_id = var.network_comp_id filter { name = "display_name" values = ["^${var.vcn_prefix}"] regex = true } } output "vcn_names" { value = data.oci_core_vcns.spoke_vcns.virtual_networks.*.display_name }
正则规则说明
^:表示匹配字符串的起始位置,确保只有以vcn-spoke开头的名称会被匹配- 如果需要包含匹配(即名称中任意位置包含
vcn-spoke),可以直接写["${var.vcn_prefix}"] - 复杂匹配需求可参考标准正则语法编写规则
补充说明
使用regex = true是OCI Terraform Provider官方支持的功能,属于合规用法,并非非正规实现。之前的代码无报错是因为语法完全合法,只是匹配逻辑不符合预期,因此Terraform仅返回空的匹配结果。
内容的提问来源于stack exchange,提问作者koss
相关产品推荐
相关产品推荐

