条件表达式在 aws_security_group 资源出口块地形中不起作用

Conditional Expression not working in aws_security_group resource egress block terraform

对于资源 aws_security_group ,我只想在创建入口规则时将出口块添加到 运行。下面我使用 count 为出口块应用了条件,然后尝试使用 for_each ,但我收到错误:此处分别不期望名为“count”或“for_each”的参数。有人可以帮助我如何实现这一目标

代码

  egress {
    #for_each             = (length(split(",", var.ingress_ports_udp)) != 0 && length(split(",", var.ingress_ports_udp)) != 0) ? ["1"] : []
    from_port         = 0
    to_port           = 0
    protocol          = "-1"
    cidr_blocks       = ["0.0.0.0/0"]
  }

您正在寻找 dynamic block。它看起来像这样:

resource "aws_security_group" "mygroup" {
  name        = "mygroup"
  vpc_id      = aws_vpc.main.id

  dynamic "egress" {
    for_each = (condition) ? [1] : []
    content {
      from_port         = 0
      to_port           = 0
      protocol          = "-1"
      cidr_blocks       = ["0.0.0.0/0"]
    }
  }
}

你的情况看起来很奇怪。首先,您要检查完全相同的条件两次(length(split(",", var.ingress_ports_udp)) != 0 似乎是重复的),其次,split 永远不会 return 一个长度为 0 的列表(如果一个空字符串给出,它将 return 一个包含一个元素的列表,它本身是一个空字符串)。你可以在 split documentation page 上看到这个,第三个例子:

> split(",", "")
[
  "",
]

因此无论 var.ingress_ports_udp 的值是多少,您的条件永远不会是 false。您可以使用 compact(split(",", var.ingress_ports_udp)) 来处理这个问题(compact 将删除所有为空字符串的列表元素)。

我建议将 var.ingress_ports_udp 作为数字列表传递,而不是作为在模块中拆分的字符串传递。然后你可以简单地使用 length(var.ingress_ports_udp) > 0 ? [1] : [].