![](/img/trans.png)
[英]invalid CIDR address in terraform aws_security_group resource with cidr_blocks from file
[英]Conditional Expression not working in aws_security_group resource egress block terraform
对于资源 aws_security_group ,我想添加出口块以仅在创建入口规则时运行。 下面我使用 count 为 egress 块应用了条件,然后尝试使用 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"]
}
您正在寻找动态块。 它看起来像这样:
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
永远不会返回长度为 0 的列表(如果给出一个空字符串,它将返回一个包含一个元素的列表,它本身就是一个空字符串)。 您可以在拆分文档页面上看到这一点,第三个示例:
> split(",", "")
[
"",
]
所以你的条件永远不会是false
,无论var.ingress_ports_udp
的值是什么。 您可以使用compact(split(",", var.ingress_ports_udp))
来处理这个问题( compact将删除任何为空字符串的列表元素)。
我建议将var.ingress_ports_udp
作为数字列表传入,而不是作为在模块中拆分的字符串。 然后你可以简单地使用length(var.ingress_ports_udp) > 0 ? [1] : []
length(var.ingress_ports_udp) > 0 ? [1] : []
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.