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

如何通过独立ARM模板为现有存储账户新增virtualNetworkRules且不覆盖原有规则

问题描述

我有一个用于部署(含存储账户)若干资源的Azure ARM模板。该存储账户需仅对若干服务开放访问,但服务组合随部署变化且部署时未知,还可动态部署新服务。virtualNetworkRules条目所需的子网ID定义在各服务的独立模板中。

我的问题是:是否可完全通过ARM模板更新现有存储账户,新增virtualNetworkRules条目且不覆盖原有规则?

存储账户ARM模板片段:

{
    "type": "Microsoft.Storage/storageAccounts",
    "name": "<regional account>",
    "location": "[resourceGroup().location]",

    "kind": "StorageV2",
    "properties": {
        "accessTier": "Hot", 
        "dnsEndpointType": "Standard", 
        "publicNetworkAccess": "Disabled", 
        "allowSharedKeyAccess": false,
        "networkAcls": {
            "bypass": "AzureServices",
            "virtualNetworkRules": [
                // not known at time of deployment
            ], 
            "ipRules": [],
        },
        "supportsHttpsTrafficOnly": true      
    }
}

每个服务独立部署自身VNet等资源的模板片段:

{
    "type": "Microsoft.Network/virtualNetworks", 
    "name": "<different per service>",
    "location": "[resourceGroup().location]",
    ....
    "properties": {
        ....
        "subnets": [
            {
                "name": "<maybe one>"
            },
            {
                "name": "<maybe more>"
            }
            ....
        ],
    }
}
{
   //... can I update the 'virtualNetworkRules' from here?
}
回答

可以完全通过ARM模板实现增量更新存储账户的virtualNetworkRules而不覆盖原有规则,核心是利用ARM模板的reference函数读取存储账户当前的规则配置,再将新服务的子网规则追加到现有数组中。具体实现方式如下:

  • 在服务模板中添加存储账户的更新逻辑
    在每个服务的独立ARM模板里,新增存储账户的资源定义,通过reference函数获取存储账户当前的virtualNetworkRules,再用concat函数将新的子网规则追加到现有数组后。

  • 关键代码示例
    服务模板中用于更新存储账户规则的片段:

    {
        "type": "Microsoft.Storage/storageAccounts",
        "name": "<regional account>",
        "apiVersion": "2023-01-01",
        "location": "[resourceGroup().location]",
        "kind": "StorageV2",
        "properties": {
            "accessTier": "Hot",
            "dnsEndpointType": "Standard",
            "publicNetworkAccess": "Disabled",
            "allowSharedKeyAccess": false,
            "networkAcls": {
                "bypass": "AzureServices",
                "virtualNetworkRules": "[concat(reference(resourceId('Microsoft.Storage/storageAccounts', '<regional account>'), '2023-01-01').networkAcls.virtualNetworkRules, createArray({ 'id': resourceId('Microsoft.Network/virtualNetworks/subnets', '<service vnet name>', '<service subnet name>'), 'action': 'Allow' }))]",
                "ipRules": []
            },
            "supportsHttpsTrafficOnly": true
        }
    }
    
  • 注意事项

    • 务必使用兼容的API版本(建议选用最新稳定版,如2023-01-01),确保reference函数能正确返回存储账户的现有规则配置。
    • 部署服务模板时,执行部署的主体需要拥有存储账户的写入权限。
    • 若存储账户原本没有virtualNetworkRules配置,reference函数会返回空数组,concat仍能正常追加新规则。
    • 避免同时并发部署多个服务模板更新同一存储账户,可能导致规则覆盖,建议串行部署或使用资源锁机制。

内容的提问来源于stack exchange,提问作者Sten Petrov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:28:26