Я пытаюсь настроить Брандмауэр базы данных Digital Ocean, который использует следующий синтаксис:
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-адресов из белого списка, которые следует добавить в брандмауэр вместе с блоком IP-адресов VPC. Сначала я попытался добавить их с помощью 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-адрес сохраняется и отображается на панели инструментов.
Я также пытался использовать for_each
в блоке rule
, но это выдает ошибку, что она может появляться только в модулях или блоках ресурсов.
Я также пытался передать список напрямую в value
, но он поддерживает только строки, а не списки.
Как я могу добавить блок rule { }
для каждого IP в var.db_allowed_ips
и digitalocean_vpc.app_vpc.ip_range
?
Вы можете добиться этого с помощью динамический блок:
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)
.