如何在Terraform中仅更新阶段设置Azure Key Vault的公网访问禁用属性?
解决方案
你可以通过分阶段部署的方式实现:先开启公网访问创建Key Vault和密钥,再禁用公网访问。具体有两种可行方式:
方式一:手动分两次执行Terraform
- 初始配置中,将Key Vault的
public_network_access_enabled设为true,正常定义azurerm_key_vault和azurerm_key_vault_key资源:
resource "azurerm_key_vault" "example" { name = "example-keyvault" location = azurerm_resource_group.example.location resource_group_name = azurerm_resource_group.example.name tenant_id = data.azurerm_client_config.current.tenant_id soft_delete_retention_days = 7 purge_protection_enabled = true public_network_access_enabled = true sku_name = "standard" access_policy { tenant_id = data.azurerm_client_config.current.tenant_id object_id = data.azurerm_client_config.current.object_id key_permissions = [ "Create", "Get", "List", ] } } resource "azurerm_key_vault_key" "example" { name = "example-key" key_vault_id = azurerm_key_vault.example.id key_type = "RSA" key_size = 2048 key_opts = [ "decrypt", "encrypt", "sign", "unwrapKey", "verify", "wrapKey", ] }
- 第一次执行
terraform apply,完成Key Vault和密钥的创建。 - 修改
azurerm_key_vault资源的public_network_access_enabled为false,再次执行terraform apply。此时密钥已存在,Terraform仅更新Key Vault的网络配置,不会触发密钥创建阶段的403错误。
⚠️ 注意:第二次执行terraform apply时,你的Terraform运行环境需要能访问Key Vault(比如通过私有端点接入Key Vault所在VNet,或者在Key Vault的防火墙允许列表内),否则会因网络访问被拒导致更新失败。
方式二:用变量自动化控制部署阶段
可以定义一个布尔变量来控制公网访问的状态,避免手动修改配置文件:
- 定义变量:
variable "enable_public_access" { type = bool description = "控制Key Vault是否开启公网访问" default = true }
- 在Key Vault资源中引用该变量:
resource "azurerm_key_vault" "example" { // 其他配置保持不变 public_network_access_enabled = var.enable_public_access // 其他配置保持不变 }
- 第一次部署时,直接执行
terraform apply(默认开启公网访问),完成密钥创建。 - 第二次部署时,指定变量值关闭公网访问:
terraform apply -var enable_public_access=false
如果你的场景需要完全自动化,也可以结合CI/CD流水线分阶段执行上述步骤,但手动分两次apply或用变量控制已经能解决大部分场景的问题。
内容的提问来源于stack exchange,提问作者Alexandru Tuca
相关产品推荐
相关产品推荐

