You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一资源组多VNet中Function Apps访问KeyVault私有密钥问题

问题:多VNet下KeyVault私有端点DNS记录覆盖导致Function App无法连接

部署环境与配置

使用Bicep部署1个KeyVault和2个Function App,将编译后的ARM模板通过Azure门户「部署自定义模板」测试。KeyVault核心配置如下:

  • 禁用公网访问
  • 配置私有端点及关联的私有DNS区域链接

对应的核心Bicep代码:

var is_private_access = SUBNET_ID != ''

resource KeyVault 'Microsoft.KeyVault/vaults@2024-04-01-preview' = {
  name: key_vault_unique_name
  location: REGION
  properties: {
    accessPolicies: ENABLE_RBAC_AUTHORIZATION ? [] : ACCESS_POLICIES
    createMode: CREATE_MODE
    enabledForDeployment: ENABLED_FOR_DEPLOYMENT
    enabledForDiskEncryption: ENABLED_FOR_DISK_ENCRYPTION
    enabledForTemplateDeployment: ENABLED_FOR_TEMPLATE_DEPLOYMENT
    enablePurgeProtection: ENABLE_PURGE_PROTECTION
    enableRbacAuthorization: ENABLE_RBAC_AUTHORIZATION
    enableSoftDelete: ENABLE_SOFT_DELETE
    networkAcls: {}
    publicNetworkAccess: is_private_access ? 'disabled' : 'enabled'
    sku: {
      family: 'A'
      name: 'Standard'
    }
    softDeleteRetentionInDays: SOFT_DELETE_RETENTION_DAYS
    tenantId: TENANT_ID
    vaultUri: VAULT_URI
  }
}

resource PrivateEndpoint 'Microsoft.Network/privateEndpoints@2021-02-01' = if (is_private_access) {
  name: take('VaultPrivateEndpoint-${KEY_VAULT_UNIQUE_STRING}', 64)
  location: REGION
  properties: {
    subnet: {
      id: SUBNET_ID
    }
    privateLinkServiceConnections: [
      {
        name: '${KeyVault.name}-file-private-link-connection'
        properties: {
          privateLinkServiceId: KeyVault.id
          groupIds: [
            'vault'
          ]
        }
      }
    ]
  }
}

resource VaultPrivateDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' existing = if (is_private_access) {
  name: 'privatelink.vaultcore.azure.net'
}

resource PrivateDnsZoneLink 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = if (is_private_access) {
  parent: VaultPrivateDnsZone
  name: take('virtual-network-link-${KEY_VAULT_UNIQUE_STRING}', 64)
  location: REGION
  properties: {
    registrationEnabled: false
    virtualNetwork: {
      id: VNET_ID
    }
  }
}

resource PrivateDnsZoneGroup 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups@2023-11-01' = if (is_private_access) {
  parent: PrivateEndpoint
  name: 'VaultDnsGroup'
  properties: {
    privateDnsZoneConfigs: [
      {
        name: 'vaultConfig'
        properties: {
          privateDnsZoneId: VaultPrivateDnsZone.id
        }
      }
    ]
  }
}

两个Function App分别部署在独立的VNet和子网中,每个子网都配置了指向privatelink.vaultcore.azure.net私有DNS区域的私有端点及链接。

故障现象

  • 第一个VNet的私有端点部署完成后,对应Function App可正常从KeyVault拉取密钥填充环境变量
  • 部署第二个VNet的私有端点后,两个Function App均无法连接KeyVault

排查结果

  • 第二个私有端点部署时,会在privatelink.vaultcore.azure.net私有DNS区域中覆盖KeyVault对应的A记录,将原有IP替换为第二个私有端点的IP
  • 手动为该A记录添加两个私有端点的IP可临时恢复连接,但私有端点的IP是部署阶段自动生成的,无法在ARM模板中直接引用,导致该临时方案无法通过模板自动化部署

补充说明

遵循微软KeyVault私有部署指南及故障排查文档时,文档建议为每个VNet创建私有DNS区域,但同一资源组内无法创建多个同名的privatelink.vaultcore.azure.net私有DNS区域,该方案不具备可行性。

内容的提问来源于stack exchange,提问作者Sahar LaOr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:47:33