快速入门:在 Bicep 中创建多个资源实例

了解如何使用不同的 for 语法在 Bicep 中创建多个资源实例。 尽管本文仅介绍了如何创建多个资源实例,但同样的方法可用于定义模块、变量、属性或输出的副本。 要了解详细信息,请参阅 Bicep 循环。

本文包含以下主题:

先决条件

如果没有 Azure 订阅,请在开始前创建一个试用版订阅。

若要设置环境以进行 Bicep 开发,请参阅安装 Bicep 工具。 完成这些步骤后,你将具备 Visual Studio Code 和 Bicep 扩展。 你还将具备最新的Azure CLI 或最新的 Azure PowerShell 模块。

创建单个实例

在本部分中,你将定义用于创建存储帐户的 Bicep 文件,然后部署 Bicep 文件。 后续部分提供了不同 for 语法的 Bicep 示例。 可以使用相同的部署方法对这些示例进行部署和试验。 如果部署失败,原因可能是下列其中一种:

  • 存储帐户名称太长。 存储帐户名称必须为 3 到 24 个字符,并且只能包含数字和小写字母。
  • 存储帐户名称不唯一。 存储帐户名称在 Azure 中必须是唯一的。

以下 Bicep 文件定义了一个存储帐户:

param rgLocation string = resourceGroup().location

resource createStorage 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: 'storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

在本地保存 Bicep 文件,然后使用 Azure CLI 或 Azure PowerShell 部署 Bicep 文件:

resourceGroupName = "{provide-a-resource-group-name}"
templateFile="{provide-the-path-to-the-bicep-file}"

az group create --name $resourceGroupName --location chinaeast2

az deployment group create --resource-group $resourceGroupName --template-file $templateFile

使用整数索引

以下示例中使用带有索引的 for 循环来创建两个存储帐户:

param rgLocation string = resourceGroup().location
param storageCount int = 2

resource createStorages 'Microsoft.Storage/storageAccounts@2025-06-01' = [for i in range(0, storageCount): {
  name: '${i}storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

output names array = [for i in range(0,storageCount) : {
  name: createStorages[i].name
} ]

索引号用作存储帐户名称的一部分。 部署 Bicep 文件后,将获得两个类似于以下内容的存储帐户:

使用整数索引,以 0 作为起始数

在 range() 中,第一个数字为起始数字,第二个数字为循环运行的次数。 因此,如果将其更改为 range(3,2),则也会获得两个存储帐户:

使用整数索引,以 3 作为起始数

上述示例的输出显示了如何引用循环中创建的资源。 输出类似于:

"outputs": {
  "names": {
    "type": "Array",
    "value": [
      {
        "name": "0storage52iyjssggmvue"
      },
      {
        "name": "1storage52iyjssggmvue"
      }
    ]
  }
},

使用数组元素

可以循环遍历数组。 以下示例显示了一个字符串数组。

param rgLocation string = resourceGroup().location
param storageNames array = [
  'contoso'
  'fabrikam'
]

resource createStorages 'Microsoft.Storage/storageAccounts@2025-06-01' = [for name in storageNames: {
  name: '${name}str${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

循环使用数组中的所有字符串作为存储帐户名称的一部分。 在这种情况下,它会创建两个存储帐户:

使用字符串数组

也可以循环遍历对象数组。 该循环不仅能自定义存储帐户名称,也可配置 SKU。

param rgLocation string = resourceGroup().location
param storages array = [
  {
    name: 'contoso'
    skuName: 'Standard_LRS'
  }
  {
    name: 'fabrikam'
    skuName: 'Premium_LRS'
  }
]

resource createStorages 'Microsoft.Storage/storageAccounts@2025-06-01' = [for storage in storages: {
  name: '${storage.name}obj${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: storage.skuName
  }
  kind: 'StorageV2'
}]

该循环创建两个存储帐户。 名称以“fabrikam”开头的存储帐户的 SKU 是“Premium_LRS” 。

使用字符串数组

使用数组和索引

在相同情况下,可能希望将数组循环与索引循环结合起来。 以下示例显示了如何使用数组和索引号进行命名约定。

param rgLocation string = resourceGroup().location
param storageNames array = [
  'contoso'
  'fabrikam'
]

resource createStorages 'Microsoft.Storage/storageAccounts@2025-06-01' = [for (name, i) in storageNames: {
  name: '${i}${name}${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

部署上述示例后,将创建两个类似于以下内容的存储帐户:

使用字符串和索引号的数组

使用字典对象

要在字典对象中循环访问元素,请使用 items 函数,该函数会将对象转换为数组。 请使用 value 属性获取对象的属性。

param rgLocation string = resourceGroup().location

param storageConfig object = {
  storage1: {
    name: 'contoso'
    skuName: 'Standard_LRS'
  }
  storage2: {
    name: 'fabrikam'
    skuName: 'Premium_LRS'
  }
}

resource createStorages 'Microsoft.Storage/storageAccounts@2025-06-01' = [for config in items(storageConfig): {
  name: '${config.value.name}${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: config.value.skuName
  }
  kind: 'StorageV2'
}]

该循环创建两个存储帐户。 名称以“fabrikam”开头的存储帐户的 SKU 是“Premium_LRS” 。

使用字典对象

带条件的循环

对于资源和模块,可以使用循环语法添加 if 表达式,以按条件部署集合。

param rgLocation string = resourceGroup().location
param storageCount int = 2
param createNewStorage bool = true

resource createStorages 'Microsoft.Storage/storageAccounts@2025-06-01' = [for i in range(0, storageCount): if(createNewStorage) {
  name: '${i}storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

有关详细信息,请参阅 Bicep 中的条件部署。

清理资源

如果不再需要本文中创建的 Azure 资源,请使用 Azure CLI 或 Azure PowerShell 模块删除快速入门资源组。

resourceGroupName = "{provide-the-resource-group-name}"

az group delete --name $resourceGroupName