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



我正在尝试建立一个数字海洋数据库防火墙,它使用以下语法:

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 { }块?

您可以通过动态块来实现这一点:

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元参数接受list(string)的值,但由于安全并使用到set(string)的正常类型转换,不会有任何损失。

相关内容

  • 没有找到相关文章

最新更新