我正在使用 Terraform 将应用程序部署到 Azure,包括 MySQL 服务器和应用程序服务,并且希望将数据库访问限制为仅应用程序服务。应用服务有一个出站 IP 列表,所以我想我需要在数据库上为这些创建防火墙规则。我发现在 Terraform 中,我不能使用count
或for_each
动态创建这些规则,因为事先不知道值。
我们还考虑过对计数进行硬编码,但 Azure 文档并未确认 IP 的数量。有了这个,并且在 stackoverflow 评论中看到不同的数字后,我担心这个数字可能会在某个时候发生变化并破坏未来的部署。
输出错误建议使用-target
作为解决方法,但由于潜在风险,Terraform 文档明确建议不要这样做。
有什么解决方案的建议吗?是否有解决方法,或者是否有另一种更适合的方法?
到目前为止,我使用的非功能代码可以更好地了解我正在尝试做的事情:
...
locals {
appIps = split(",", azurerm_app_service.appService.outbound_ip_addresses)
}
resource "azurerm_mysql_firewall_rule" "appFirewallRule" {
count = length(appIps)
depends_on = [azurerm_app_service.appService]
name = "appService-${count.index}"
resource_group_name = "myResourceGroup"
server_name = azurerm_mysql_server.databaseServer.name
start_ip_address = local.appIps[count.index]
end_ip_address = local.appIps[count.index]
}
...
这将返回错误:
Error: Invalid count argument
on main.tf line 331, in resource "azurerm_mysql_firewall_rule" "appFirewallRule":
331: count = length(local.appIps)
The "count" value depends on resource attributes that cannot be determined
until apply, so Terraform cannot predict how many instances will be created.
To work around this, use the -target argument to first apply only the
resources that the count depends on.