Terraform中aws_ami数据源name_regex不支持负向前瞻正则的问题
解决Terraform aws_ami数据源正则不支持负向预查的问题
问题背景
你在使用Terraform的aws_ami数据源时,需要从两种AMI命名中筛选出第一种:
centos-7-java-testing-DATEcentos-7-java-pci-testing-DATE
由于第二种AMI创建时间更晚,开启most_recent = true时会优先匹配到它。你尝试用负向预查正则^centos-7-java-(?!.*pci).*排除含"pci"的AMI,但触发报错:
Error: "name_regex": error parsing regexp: invalid or unsupported Perl syntax: `(?!`
原因分析
Terraform底层使用Go语言的RE2正则引擎,该引擎不支持Perl风格的零宽负向预查((?!...))语法,因此这类正则无法被解析。
解决方案
方案1:精确正向匹配(推荐)
既然两种AMI的命名前缀有明确差异,直接匹配第一种的完整前缀即可,无需复杂的排除逻辑:
data "aws_ami" "main" { most_recent = true name_regex = "^centos-7-java-testing-.*" owners = var.owners }
这个正则只会匹配以centos-7-java-testing-开头的AMI,完美避开带"pci"的第二种AMI。
方案2:RE2兼容的排除式正则
如果需要更通用的排除逻辑(比如前缀不固定,但要排除含"pci"的AMI),可以用RE2支持的语法模拟排除效果:
data "aws_ami" "main" { most_recent = true name_regex = "^centos-7-java-(?:[^p]+|p(?!ci)[^p]*)*$" owners = var.owners }
该正则的逻辑是:匹配centos-7-java-之后的内容,要么是不含"p"的字符,要么是"p"后面不跟"ci"的字符,以此确保整个字符串中不出现"pci"。
内容的提问来源于stack exchange,提问作者user2275908
相关产品推荐
相关产品推荐

