从字符串列表中在循环中添加资源参数

Add resource argument in loop from list of strings

我正在尝试设置 Digital Ocean Database Firewall,它使用以下语法:

resource "digitalocean_database_firewall" "example-fw" {
  cluster_id = digitalocean_database_cluster.app.id

  rule {
    type  = "ip_addr"
    value = "192.168.1.1"
  }

  rule {
    type  = "ip_addr"
    value = "192.0.2.0"
  }
}

我有一个变量,它是应该添加到防火墙的白名单 IP 列表,以及 VPC IP 块。我首先尝试使用 for_each:

添加这些
# Postgres firewall (only allow connection inside VPC)
resource "digitalocean_database_firewall" "vpc-fw" {
  cluster_id = digitalocean_database_cluster.app.id

  rule {
    type  = "ip_addr"
    value = digitalocean_vpc.app_vpc.ip_range
  }
}

# Postgres firewall (allow connections from whitelisted IPs)
resource "digitalocean_database_firewall" "whitelisted-fw" {
  for_each = toset(var.db_allowed_ips)

  cluster_id = digitalocean_database_cluster.app.id

  rule {
    type  = "ip_addr"
    value = each.key
  }
}

然而,似乎每个集群只能拥有一个防火墙资源,因为只有最后一个 IP 被保存并显示在仪表板上。

我也试过在 rule 块中使用 for_each 但这会引发一个错误,它只能出现在模块或资源块中。

我也试过直接将列表传递给 value,但它只支持字符串而不支持列表。

如何为 var.db_allowed_ipsdigitalocean_vpc.app_vpc.ip_range 中的每个 IP 添加一个 rule { } 块?

您可以通过 dynamic block:

resource "digitalocean_database_firewall" "whitelisted-fw" {
  cluster_id = digitalocean_database_cluster.app.id

  dynamic "rule" {
    for_each = toset(var.db_allowed_ips)

    content {
      type  = "ip_addr"
      value = each.value
    }
  }
}

我相信 for_each meta-argument 在动态块范围内接受 list(string) 的值,但是为了安全并使用到 [=13= 的正常类型转换,不会丢失任何内容].