Bicep 中的资源声明

本文介绍用于将资源添加到 Bicep 文件的语法。 一个 Bicep 文件中最多可以包含 800 个资源。 有关详细信息,请参阅模板限制

定义资源

使用 resource 关键字添加资源声明。 设置资源的符号名称。 符号名称与资源名称不同。 使用符号名称引用Bicep文件的其他部分中的资源。

@<decorator>(<argument>)
resource <symbolic-name> '<full-type-name>@<api-version>' = {
  <resource-properties>
}

存储帐户的声明可以从以下项开始:

resource stg 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  ...
}

符号名称区分大小写。 它们可以包含字母、数字和下划线(_)。 不能以数字开头。 资源不能与参数、变量或模块同名。

有关可用的资源类型和版本,请参阅Bicep资源参考。 Bicep 不支持 apiProfile,而这在 Azure 资源管理器模板 (ARM 模板) JSON 中可用。

若要按条件部署资源,请使用 if 语法。 有关详细信息,请参阅 Bicep 中的条件部署

resource <symbolic-name> '<full-type-name>@<api-version>' = if (condition) {
  <resource-properties>
}

若要部署一个资源的多个实例,请使用 for 语法。 可使用 batchSize 修饰器指定是串行部署实例还是并行部署实例。 有关详细信息,请参阅 Bicep 中的迭代循环

@batchSize(int) // optional decorator for serial deployment
resource <symbolic-name> '<full-type-name>@<api-version>' = [for <item> in <collection>: {
  <properties-to-repeat>
}]

还可以对资源属性使用 for 语法来创建数组。

resource <symbolic-name> '<full-type-name>@<api-version>' = {
  properties: {
    <array-property>: [for <item> in <collection>: <value-to-repeat>]
  }
}

使用修饰器

以格式 @expression 编写修饰器,并将其置于资源声明之上。 下表显示了资源的可用修饰器。

装饰器 Argument 说明
batchSize 设置实例以按顺序部署。
说明 字符串 请为该资源提供说明。
nullIfNotFound 如果该资源不存在,资源符号会求值为 null,而不是导致部署失败。
onlyIfNotExists 仅当目标范围中尚不存在资源时,才部署资源。

修饰器位于 sys 命名空间中。 如果需要将修饰器与具有相同名称的其他项区分开来,请在修饰器前面加上 sys。 例如,如果你的 Bicep 文件包含一个名为 description 的参数,则在使用 description 修饰器时,必须添加 sys 命名空间。

批量大小

只能将 @batchSize() 应用于使用 for 表达式的资源或模块定义。

默认情况下,将并行部署资源。 添加 batchSize(int) 修饰器时,将串行部署实例。

@batchSize(3)
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2025-06-01' = [for storageName in storageAccounts: {
  ...
}]

有关详细信息,请参阅批量部署

说明

若要添加解释,请将说明添加到资源声明。 例如:

@description('Create a number of storage accounts')
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2025-06-01' = [for storageName in storageAccounts: {
  ...
}]

可以使用 Markdown 格式的文本作为说明文本。

nullIfNotFound

@nullIfNotFound() 修饰器应用于现有资源声明。 引用Bicep中的现有资源(使用现有关键字)时,如果未在部署时找到该资源,ARM 部署将失败。 通过应用 @nullIfNotFound(),如果资源不存在,资源符号会计算为 null,而不会导致部署失败。

@nullIfNotFound()
resource centralWorkspace 'Microsoft.OperationalInsights/workspaces@2023-09-01' existing = {
  name: 'central-log-analytics'
}

// Safe access
output workspaceId string = centralWorkspace.?id ?? ''
output workspaceExists bool = centralWorkspace != null

onlyIfNotExists

默认情况下,当 Bicep 部署运行时,Azure 资源管理器 (ARM) 会创建资源(如果其不存在)或更新资源(如果其已存在)。 如果现有资源具有不同于模板的属性,ARM 可能会尝试更新它,或者如果不允许更新,则失败。

从 Bicep 版本 v0.38.3 开始,@onlyIfNotExists()修饰器指示 ARM 仅在资源不存在时才创建资源。 如果 ARM 找到具有资源 ID 的资源,则会跳过创建并保留现有资源不变。

@onlyIfNotExists()
resource example 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: 'mystorageacct'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

资源名称

每个资源都有一个名称。 设置资源名称时,请注意资源名称的规则和限制

resource stg 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: 'examplestorage'
  ...
}

通常,将名称设置为参数,以便在部署期间传入不同的值。

@minLength(3)
@maxLength(24)
param storageAccountName string

resource stg 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: storageAccountName
  ...
}

资源位置

许多资源需要一个位置。 你可以通过 intellisense 确定资源是否需要指定位置。 以下示例添加用于存储帐户的位置参数。

resource stg 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: 'examplestorage'
  location: 'chinaeast2'
  ...
}

通常,将位置设置为参数,以便可以部署到不同的位置。

param location string = resourceGroup().location

resource stg 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: 'examplestorage'
  location: location
  ...
}

不同位置支持的资源类型不一样。 若要获取Azure服务支持的位置,请参阅“按区域提供的产品”。 若要获取资源类型支持的位置,请使用 Azure PowerShell 或 Azure CLI。

((Get-AzResourceProvider -ProviderNamespace Microsoft.Batch).ResourceTypes `
  | Where-Object ResourceTypeName -eq batchAccounts).Locations

资源标记

可以在部署期间对资源应用标记。 可以通过标记对部署的资源进行逻辑组织。 有关指定标记的不同方法的示例,请参阅 ARM 模板标记

资源的托管标识

某些资源支持 Azure 资源托管标识。 这些资源在资源声明的根级别包含一个标识对象。

可以使用系统分配的或用户分配的标识。

以下示例演示如何为 Azure Kubernetes 服务群集配置系统分配的标识。

resource aks 'Microsoft.ContainerService/managedClusters@2025-08-02-preview' = {
  name: clusterName
  location: location
  tags: tags
  identity: {
    type: 'SystemAssigned'
  }

下一个示例显示如何为虚拟机配置用户分配的身份。

param userAssignedIdentity string

resource vm 'Microsoft.Compute/virtualMachines@2025-04-01' = {
  name: vmName
  location: location
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${userAssignedIdentity}': {}
    }
  }

特定于资源的属性

上述属性对于大多数资源类型都是通用的。 设置这些值后,设置特定于要部署的资源类型的属性。

使用 Intellisense 来确定哪些属性可用以及哪些属性是必需的。 下面的示例将为存储帐户设置其余属性。

resource stg 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: 'examplestorage'
  location: 'chinaeast2'
  sku: {
    name: 'Standard_LRS'
    tier: 'Standard'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

后续步骤