Terraform 地形动态进入的规则

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会发回一条消息,即

我有一个动态嵌套块,用于在网络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会发回一条消息,即规则不需要是唯一的:

错误:创建入口条目时出错: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之间是否会发生冲突?)