如何通过独立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仍能正常追加新规则。 - 避免同时并发部署多个服务模板更新同一存储账户,可能导致规则覆盖,建议串行部署或使用资源锁机制。
- 务必使用兼容的API版本(建议选用最新稳定版,如
内容的提问来源于stack exchange,提问作者Sten Petrov
相关产品推荐
相关产品推荐

