Terraform配置Azure Key Vault网络ACL按环境生效问题
多环境Azure Key Vault网络ACL条件配置解决方案
你的问题出在Terraform不支持直接用三元表达式选择不同的network_acls块定义,三元表达式仅适用于参数赋值,不能控制整个block的声明逻辑。以下是两种可行的配置方案:
方案一:参数级条件赋值(推荐)
直接在network_acls块内通过条件表达式动态设置参数值,最简洁高效:
resource "azurerm_key_vault" "mykeyvault" { name = lower(format("%s-%s", var.environment_name, "key")) access_policy { tenant_id = var.tenant_id object_id = var.object_id secret_permissions = ["Get"] } network_acls { default_action = contains(["PRE", "PRD"], var.environment_name) ? "Deny" : "Allow" bypass = "AzureServices" # 仅在PRE/PRD环境配置IP规则,其他环境留空(自动生效默认允许逻辑) ip_rules = contains(["PRE", "PRD"], var.environment_name) ? ["1.2.3.4/5"] : [] } }
说明:
- 用
contains函数判断当前环境是否属于生产类环境(PRE/PRD),动态切换default_action - 生产类环境自动加载IP规则,非生产环境IP规则为空,配合
default_action = "Allow"实现全网络访问
方案二:Dynamic块条件生成(灵活扩展场景)
如果后续需要更复杂的环境差异化配置,可使用dynamic块实现条件性的block生成:
resource "azurerm_key_vault" "mykeyvault" { name = lower(format("%s-%s", var.environment_name, "key")) access_policy { tenant_id = var.tenant_id object_id = var.object_id secret_permissions = ["Get"] } dynamic "network_acls" { for_each = [var.environment_name] content { default_action = contains(["PRE", "PRD"], network_acls.value) ? "Deny" : "Allow" bypass = "AzureServices" ip_rules = contains(["PRE", "PRD"], network_acls.value) ? ["1.2.3.4/5"] : [] } } }
注意:原代码中存在变量名不一致问题(var.environment_instance和var.environment_name),请统一变量名称避免报错。
内容的提问来源于stack exchange,提问作者nitesh malik
相关产品推荐
相关产品推荐

