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

Terraform中aws_ami数据源name_regex不支持负向前瞻正则的问题

解决Terraform aws_ami数据源正则不支持负向预查的问题

问题背景

你在使用Terraform的aws_ami数据源时,需要从两种AMI命名中筛选出第一种:

  1. centos-7-java-testing-DATE
  2. centos-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:21:24