Terraform 地形动态进入的规则
我有一个动态嵌套块,用于在网络ACL中创建入口规则列表:Terraform 地形动态进入的规则,terraform,Terraform,我有一个动态嵌套块,用于在网络ACL中创建入口规则列表: 资源“aws\U网络acl”“网络acl”{ vpc_id=aws_vpc.vpc.id 动态“入口”{ for_each=var.ssh_cidr_块 迭代器=cidr 内容{ 规则编号=100 协议=“tcp” action=“允许” cidr_块=cidr.value 从_端口=22 至_端口=22 } } } 可以看出,我正在为var.ssh\u CIDR\u块中的每个CIDR生成入口 但是,这不起作用,AWS会发回一条消息,即
资源“aws\U网络acl”“网络acl”{
vpc_id=aws_vpc.vpc.id
动态“入口”{
for_each=var.ssh_cidr_块
迭代器=cidr
内容{
规则编号=100
协议=“tcp”
action=“允许”
cidr_块=cidr.value
从_端口=22
至_端口=22
}
}
}
可以看出,我正在为var.ssh\u CIDR\u块中的每个CIDR生成入口
但是,这不起作用,AWS会发回一条消息,即规则不需要是唯一的:
错误:创建入口条目时出错:NetworkAccelEntryReadyExists:由100标识的网络acl条目已存在。
状态代码:400,请求id:c9b4b5ad-c1a9-4a85-a4e0-b0559e14ea53
我有点困惑,因为动态入口规则中的网络ACL是动态嵌套块的类用例。然而这似乎根本不可能
有什么方法可以做到这一点吗?这里有一个使用范围的选项,以避免重复的规则\u no
:
locals {
ssh_cidr_blocks = [
"10.0.208.0/20",
"10.0.192.0/20",
"10.0.224.0/20"
]
}
resource "aws_network_acl" "network_acl" {
vpc_id = aws_vpc.myvpc.id
dynamic "ingress" {
for_each = range(length(local.ssh_cidr_blocks))
iterator = i
content {
rule_no = i.value
protocol = "tcp"
action = "allow"
cidr_block = local.ssh_cidr_blocks[i.value]
from_port = 22
to_port = 22
}
}
}
由于所有acl规则都是allow
的,因此顺序并不重要,我们可以不受影响
但是,当您创建更复杂的规则时,我不确定这是否可以接受,因为您将混合允许和拒绝,并且顺序很重要。您可以跟随@Kyle comment并使用映射,在这种情况下,关键是规则\u no
,代码类似于:
locals {
ssh_cidr_blocks = {
100 = "10.0.208.0/20",
200 = "10.0.192.0/20",
500 = "10.0.224.0/20"
}
}
resource "aws_network_acl" "network_acl" {
vpc_id = aws_vpc.myvpc.id
dynamic "ingress" {
for_each = local.ssh_cidr_blocks
content {
rule_no = ingress.key
protocol = "tcp"
action = "allow"
cidr_block = ingress.value
from_port = 22
to_port = 22
}
}
}
规则\u no
用于规则的排序(排序优先级),并且它们必须是唯一的。如果您不关心排序,我想您可以创建一个map变量并包含一个“假”索引。不过,我想知道是否最好在主资源块中为每个
使用(也就是说,创建许多网络
acl
资源,每个资源都有一个带有规则的入口规则
;不使用动态
)(我不确定这是否可行-不同acl之间是否会发生冲突?)