Azure Bicep部署Recovery Service Vault无法配置源/目标VNet ID问题
解决Azure Bicep创建Recovery Service Vault时无法添加Source/Target VNet ID的问题
首先明确:Azure 原生的Recovery Service Vault(Microsoft.RecoveryServices/vaults)资源本身并不包含sourceVNetId和targetVNetId属性,你提供的ARM模板片段里的这些属性,要么是自定义模板参数/变量,要么是某个第三方工具/自定义模块的扩展标记,并非Vault资源的原生配置项。这就是直接在Bicep的Vault资源中添加这些属性会报错,但你的ARM模板能运行的原因——ARM模板对自定义属性的校验更宽松,而Bicep严格遵循Azure资源的类型定义。
正确的做法是:将VNet配对配置从Vault资源中剥离,通过Site Recovery的**网络映射(Network Mapping)**单独资源来配置,步骤如下:
1. 先创建Recovery Service Vault并启用Site Recovery
用Bicep定义Vault资源,同时启用Site Recovery和诊断设置:
resource rsv 'Microsoft.RecoveryServices/vaults@2023-04-01' = { name: 'My-prod-rsv' location: resourceGroup().location identity: { type: 'None' } properties: { sku: { name: 'Standard' } // 启用Site Recovery功能 securitySettings: { siteRecoverySettings: { isEnabled: true } } } } // 配置诊断日志(对应你ARM里的enableDiagnostics) resource rsvDiagnostics 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = { name: 'rsv-site-recovery-diagnostics' scope: rsv properties: { // 替换为你的存储账户ID,或配置Log Analytics工作区 storageAccountId: '/subscriptions/<订阅ID>/resourceGroups/<资源组>/providers/Microsoft.Storage/storageAccounts/<存储账户名>' logs: [ { category: 'AzureSiteRecoveryJobs' enabled: true } { category: 'AzureSiteRecoveryEvents' enabled: true } ] metrics: [ { category: 'AllMetrics' enabled: true } ] } }
2. 创建Site Recovery网络映射资源
Source和Target VNet的配对是通过Microsoft.RecoveryServices/vaults/replicationFabrics/replicationNetworks/replicationNetworkMappings资源实现的,示例如下(以Azure到Azure复制为例):
// 参数定义 param sourceVNetId string = '/subscriptions/<订阅ID>/resourceGroups/<源资源组>/providers/Microsoft.Network/virtualNetworks/<源VNet名>' param targetVNetId string = '/subscriptions/<订阅ID>/resourceGroups/<目标资源组>/providers/Microsoft.Network/virtualNetworks/<目标VNet名>' param sourceFabricName string = 'Azure-<源区域名>' // 比如Azure-eastus param targetFabricName string = 'Azure-<目标区域名>' // 比如Azure-westus // 引用已存在的复制Fabric(Azure到Azure场景下,Fabric会自动创建,名称格式为Azure-<区域>) resource sourceFabric 'Microsoft.RecoveryServices/vaults/replicationFabrics@2023-06-01' existing = { parent: rsv name: sourceFabricName } resource targetFabric 'Microsoft.RecoveryServices/vaults/replicationFabrics@2023-06-01' existing = { parent: rsv name: targetFabricName } // 引用源和目标的复制网络 resource sourceReplicationNetwork 'Microsoft.RecoveryServices/vaults/replicationFabrics/replicationNetworks@2023-06-01' existing = { parent: sourceFabric name: sourceVNetId } resource targetReplicationNetwork 'Microsoft.RecoveryServices/vaults/replicationFabrics/replicationNetworks@2023-06-01' existing = { parent: targetFabric name: targetVNetId } // 创建网络映射 resource networkMapping 'Microsoft.RecoveryServices/vaults/replicationFabrics/replicationNetworks/replicationNetworkMappings@2023-06-01' = { parent: sourceReplicationNetwork name: '${sourceVNetId}-to-${targetVNetId}' properties: { targetNetworkId: targetReplicationNetwork.id targetFabricId: targetFabric.id fabricSpecificSettings: { instanceType: 'AzureToAzure' primaryNetworkId: sourceVNetId recoveryNetworkId: targetVNetId } } }
补充说明
你ARM模板里的skipdeployment、enableSiterecovery等属性都不是Vault的原生属性,大概率是你使用的模板工具的自定义标记:
enableSiterecovery:在Bicep中通过securitySettings.siteRecoverySettings.isEnabled: true实现skipdeployment:如果是控制是否部署Vault,可在Bicep中用条件部署(if: <布尔表达式>)实现
内容的提问来源于stack exchange,提问作者Satish B
相关产品推荐
相关产品推荐

