Terraform 如何忽略列表中的值?

Terraform 如何忽略列表中的值?,terraform,terraform-provider-aws,terraform0.12+,Terraform,Terraform Provider Aws,Terraform0.12+,我有一个字符串列表,我想忽略该列表中的某些元素。比如我的名单 variable domain_names = { type = list(string) } domain_names = ["foo.com","*.foo.com","*.foo2.com","bar.co.in"] output = [ "foo.com","bar.co.in"] 我想忽略以*开头的任何内容,并从中创建一个新列表。我怎样才能做到这一点 我试图使这个模块更加健壮,能够处理多个域名 locals {

我有一个字符串列表,我想忽略该列表中的某些元素。比如我的名单

variable domain_names = {
  type = list(string)
}

domain_names = ["foo.com","*.foo.com","*.foo2.com","bar.co.in"]

output = [ "foo.com","bar.co.in"]
我想忽略以*开头的任何内容,并从中创建一个新列表。我怎样才能做到这一点

我试图使这个模块更加健壮,能够处理多个域名

locals {
  distinct_domain_name = distinct(var.domain_names)
}

resource "aws_acm_certificate" "main" {
  count                     = length(local.distinct_domain_name)
  domain_name               = local.distinct_domain_name[count.index]
  subject_alternative_names = [slice(var.domain_names, 1, length(var.domain_names))]
  validation_method         = var.validation_method
  tags {
    Name      = local.distinct_domain_name[count.index]
    owner     = "xxx"
    terraform = "true"
  }
}

当我们的目标是筛选一个列表时,通常从带有if子句的列表开始。这使我们能够对每个元素做出决定,但提出了一个问题,即使用什么表达式来做出决定

对于如何检测字符串是否具有特定前缀的问题?我认为至少有几种不同的方法可以做到这一点,但最简洁的方法可能是使用正则表达式via,如果至少有一个匹配项,则返回true:

length(regexall("^\\*\\.", domain_name)) > 0
我在这里使用regexall而不是regex,因为regex被定义为在没有匹配的情况下返回一个错误——它至少需要一个错误——而regexall允许我们自己处理零匹配的情况

将其与for表达式相结合,将得到以下结果:

[ for domain_name in var.domain_names : domain_name if length(regexall("^\\*\\.", domain_name)) > 0 ]
上面列出了一个有*的列表。作为前缀。我们可以对该表达式求反以生成相反的子集:

[ for domain_name in var.domain_names : domain_name if length(regexall("^\\*\\.", domain_name)) == 0 ]

当我们的目标是筛选一个列表时,通常从带有if子句的列表开始。这使我们能够对每个元素做出决定,但提出了一个问题,即使用什么表达式来做出决定

对于如何检测字符串是否具有特定前缀的问题?我认为至少有几种不同的方法可以做到这一点,但最简洁的方法可能是使用正则表达式via,如果至少有一个匹配项,则返回true:

length(regexall("^\\*\\.", domain_name)) > 0
我在这里使用regexall而不是regex,因为regex被定义为在没有匹配的情况下返回一个错误——它至少需要一个错误——而regexall允许我们自己处理零匹配的情况

将其与for表达式相结合,将得到以下结果:

[ for domain_name in var.domain_names : domain_name if length(regexall("^\\*\\.", domain_name)) > 0 ]
上面列出了一个有*的列表。作为前缀。我们可以对该表达式求反以生成相反的子集:

[ for domain_name in var.domain_names : domain_name if length(regexall("^\\*\\.", domain_name)) == 0 ]

这可能需要一个lambda,那么我们能看到代码的上下文吗?试试这个[对于distinctvar.domain_names中的x:如果不包含distinctvar.domain_names,x]这可能需要一个lambda,那么我们能看到代码的上下文吗?试试这个[对于distinctvar.domain_names中的x:如果不包含distinctvar.domain_names,x]如果您使用terraform 0.13并遇到不适合左操作数的值:需要数字。在尝试上述解决方案时。您需要将函数添加到regexall,以根据条件计算字符串的长度。如果您使用terraform 0.13,并且遇到不适合左操作数的值:number required。在尝试上述解决方案时。您需要将函数添加到regexall,以根据条件计算字符串的长度。