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

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

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

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

Примечание

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

Учебные ресурсы

Подробные сведения о ресурсах расширения и практические инструкции см. в пошаговом руководстве Развертывание дочерних ресурсов и ресурсов расширений с помощью Bicep.

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

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

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

resource createRgLock 'Microsoft.Authorization/locks@2016-09-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@2020-04-01-preview' = {
  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@2019-04-01' = {
  name: uniqueStorageName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'Storage'
  properties: {}
}

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

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

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

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

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

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

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

  • 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@2021-09-01' existing = {
      name: storageAccountName
    }
    
    resource storeLock 'Microsoft.Authorization/locks@2017-04-01' = {
      scope: storage
      name: 'storeLock'
      properties: {
        level: 'CanNotDelete'
        notes: 'Storage account should not be deleted.'
      }
    }
    

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

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