Настройка области для ресурсов расширения в Bicep

Ресурс расширения — это ресурс, который изменяет другой ресурс. Например, можно назначить роль ресурсу. Назначение роли — это тип ресурса расширения.

Полный список типов ресурсов расширения см. в разделе "Типы ресурсов", расширяющие возможности других ресурсов.

В этой статье показано, как задать область охвата для типа ресурса расширения при развертывании с помощью Bicep-файла. В нем описывается свойство области, доступное для ресурсов расширения при применении к ресурсу.

Примечание.

Свойство области доступно только для типов ресурсов расширения. Чтобы указать другую область для типа ресурса, который не является типом расширения, используйте модуль.

Применение в области развертывания

Чтобы применить тип ресурса расширения в целевой области развертывания, добавьте ресурс в шаблон, как и любой другой тип ресурса. Доступные области — это группа ресурсов, подписка, группа управления и клиент. Область развертывания должна поддерживать тип ресурса.

При развертывании в группе ресурсов следующий шаблон добавляет блокировку в группу ресурсов.

resource createRgLock 'Microsoft.Authorization/locks@2020-05-01' = {
  name: 'rgLock'
  properties: {
    level: 'CanNotDelete'
    notes: 'Resource group should not be deleted.'
  }
}

В следующем примере роль назначается подписке, в которую она развернута.

targetScope = 'subscription'

@description('The principal to assign the role to')
param principalId string

@allowed([
  'Owner'
  'Contributor'
  'Reader'
])
@description('Built-in role to assign')
param builtInRoleType string

var role = {
  Owner: '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/8e3af657-a8ff-443c-a75c-2fe8c4bcb635'
  Contributor: '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c'
  Reader: '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7'
}

resource roleAssignSub 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(subscription().id, principalId, role[builtInRoleType])
  properties: {
    roleDefinitionId: role[builtInRoleType]
    principalId: principalId
  }
}

Применить к ресурсу

Чтобы применить ресурс расширения к ресурсу, используйте свойство scope. В свойстве области укажите ресурс, в который добавляется расширение. Вы ссылаетесь на ресурс, указав символическое имя ресурса. Свойство области является корневым свойством для типа ресурса расширения.

В следующем примере создается учетная запись хранения и применяется к ней роль.

@description('The principal to assign the role to')
param principalId string

@allowed([
  'Owner'
  'Contributor'
  'Reader'
])
@description('Built-in role to assign')
param builtInRoleType string

param location string = resourceGroup().location

var role = {
  Owner: '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/8e3af657-a8ff-443c-a75c-2fe8c4bcb635'
  Contributor: '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c'
  Reader: '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7'
}
var uniqueStorageName = 'storage${uniqueString(resourceGroup().id)}'

resource demoStorageAcct 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: uniqueStorageName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'Storage'
  properties: {}
}

resource roleAssignStorage 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(demoStorageAcct.id, principalId, role[builtInRoleType])
  properties: {
    roleDefinitionId: role[builtInRoleType]
    principalId: principalId
  }
  scope: demoStorageAcct
}

Вы можете применить ресурс расширения к существующему ресурсу. В следующем примере добавляется блокировка в существующую учетную запись хранения.

resource demoStorageAcct 'Microsoft.Storage/storageAccounts@2025-06-01' existing = {
  name: 'examplestore'
}

resource createStorageLock 'Microsoft.Authorization/locks@2020-05-01' = {
  name: 'storeLock'
  scope: demoStorageAcct
  properties: {
    level: 'CanNotDelete'
    notes: 'Storage account should not be deleted.'
  }
}

Вы также можете применить ресурс расширения к другому ресурсу расширения, установив scope свойство на символическое имя этого ресурса расширения. Следующий пример применяет блокировку к существующему назначению роли.

resource existingRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' existing = {
  name: '00000000-0000-0000-0000-000000000000'
}

resource roleAssignmentLock 'Microsoft.Authorization/locks@2020-05-01' = {
  name: 'roleAssignmentLock'
  scope: existingRoleAssignment
  properties: {
    level: 'CanNotDelete'
    notes: 'Role assignment should not be deleted.'
  }
}

Когда любой ресурс использует это scope свойство, Bicep генерирует полностью квалифицированный идентификатор ресурса для область объёма. Это гарантирует, что скомпилированный шаблон ARM корректно разрешает область действия при вызове extensionResourceId, что требует полностью квалифицированного идентификатора ресурса в качестве первого аргумента. Это поведение применяется к ресурсам расширения и любому другому типу ресурсов, использующим это scope свойство. Он также позволяет создавать сценарии развертывания, которые ранее не поддерживались, например, развернуть ресурсы на уровне арендатора из более низкого охватки развертывания, например, подписка или группа ресурсов.

Те же требования применяются к ресурсам расширения, как и к другому ресурсу при выборе области, отличной от целевой области развертывания. Чтобы узнать больше о развертывании в нескольких областях, см. в следующей статье.

Свойства resourceGroup и подписки разрешены только в модулях. Эти свойства запрещены для отдельных ресурсов. Используйте модули, если вы хотите развернуть ресурс расширения с областью, заданной для ресурса в другой группе ресурсов.

В следующем примере показано, как применить блокировку к учетной записи хранения, которая находится в другой группе ресурсов.

  • main.bicep:

    param resourceGroup2Name string
    param storageAccountName string
    
    module applyStoreLock './storageLock.bicep' = {
      name: 'addStorageLock'
      scope: resourceGroup(resourceGroup2Name)
      params: {
        storageAccountName: storageAccountName
      }
    }
    
  • storageLock.bicep:

    param storageAccountName string
    
    resource storage 'Microsoft.Storage/storageAccounts@2023-05-01' existing = {
      name: storageAccountName
    }
    
    resource storeLock 'Microsoft.Authorization/locks@2020-05-01' = {
      scope: storage
      name: 'storeLock'
      properties: {
        level: 'CanNotDelete'
        notes: 'Storage account should not be deleted.'
      }
    }
    

Дальнейшие действия

Полный список типов ресурсов расширения см. в разделе "Типы ресурсов", расширяющие возможности других ресурсов.