【问题标题】:Rule_nos in dynamic ingress in TerraformTerraform 中动态入口中的 Rule_nos
【发布时间】:2020-06-10 03:16:55
【问题描述】:

我有一个动态嵌套块来在网络 ACL 中创建入口规则列表:

resource "aws_network_acl" "network_acl" {
  vpc_id = aws_vpc.vpc.id

  dynamic "ingress" {
    for_each = var.ssh_cidr_blocks
    iterator = cidr
    content {
      rule_no    = 100
      protocol   = "tcp"
      action     = "allow"
      cidr_block = cidr.value
      from_port  = 22
      to_port    = 22
    }
  }
}

可以看出,我正在为var.ssh_cidr_blocks 中的每个 CIDR 生成一个入口。

但这不起作用,AWS 会发回一条消息,指出 rule_no 必须是唯一的:

Error: Error creating ingress entry: NetworkAclEntryAlreadyExists: The network acl entry identified by 100 already exists.
        status code: 400, request id: c9b4b5ad-c1a9-4a85-a4e0-b0559e14ea53

我有点困惑,因为动态入口规则中的网络 ACL 是动态嵌套块的类用例。然而,这似乎是不可能的!

有什么办法吗?

【问题讨论】:

  • rule_no 用于规则的排序(某种优先级),它们必须是唯一的。如果您不关心排序,我想您可以创建一个映射变量并包含一个“假”索引。不过,我想知道在主资源块中使用for_each 是否更好(即创建许多network_acl 资源,每个资源都有一个带有rule_no = 100 的单一入口规则;不使用dynamic)(我不是确定这也行得通——rule_no 会因不同的 acl 发生冲突吗?)

标签: terraform


【解决方案1】:

这是一个使用范围来避免rule_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 评论并改用地图,在这种情况下,关键是rule_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
    }
  }
}

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 2023-03-18
    • 2021-08-11
    • 2021-07-08
    • 2019-12-29
    • 2020-09-08
    • 2020-12-14
    • 2022-01-14
    相关资源
    最近更新 更多