我正在尝试建立一个数字海洋数据库防火墙,它使用以下语法:
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_ips
和digitalocean_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)
的正常类型转换,不会有任何损失。