Definir o âmbito dos recursos de extensão no Bicep

Um recurso de extensão é um recurso que modifica outro recurso. Por exemplo, pode atribuir uma função a um recurso. A atribuição de função é um tipo de recurso de extensão.

Para obter uma lista completa dos tipos de recursos de extensão, veja Tipos de recursos que expandem as capacidades de outros recursos.

Este artigo mostra como definir o âmbito de um tipo de recurso de extensão quando implementado com um ficheiro Bicep. Descreve a propriedade de âmbito que está disponível para recursos de extensão ao aplicar a um recurso.

Nota

A propriedade de âmbito só está disponível para tipos de recursos de extensão. Para especificar um âmbito diferente para um tipo de recurso que não seja um tipo de extensão, utilize um módulo.

Recursos de preparação

Se preferir saber mais sobre os recursos de extensão através da orientação passo a passo, veja Implementar recursos subordinados e de extensão com o Bicep.

Aplicar no âmbito de implementação

Para aplicar um tipo de recurso de extensão no âmbito de implementação de destino, adicione o recurso ao modelo tal como faria com qualquer outro tipo de recurso. Os âmbitos disponíveis são grupo de recursos, subscrição, grupo de gestão e inquilino. O âmbito de implementação tem de suportar o tipo de recurso.

Quando implementado num grupo de recursos, o seguinte modelo adiciona um bloqueio a esse grupo de recursos.

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

O exemplo seguinte atribui uma função à subscrição na qual está implementada.

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
  }
}

Aplicar ao recurso

Para aplicar um recurso de extensão a um recurso, utilize a scope propriedade . Na propriedade âmbito, faça referência ao recurso ao qual está a adicionar a extensão. Para referenciar o recurso, forneça o nome simbólico do recurso. A propriedade de âmbito é uma propriedade de raiz para o tipo de recurso de extensão.

O exemplo seguinte cria uma conta de armazenamento e aplica-lhe uma função.

@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
}

Pode aplicar um recurso de extensão a um recurso existente. O exemplo seguinte adiciona um bloqueio a uma conta de armazenamento existente.

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.'
  }
}

Os mesmos requisitos aplicam-se aos recursos de extensão que outro recurso ao filtrar um âmbito diferente do âmbito de destino da implementação. Para saber mais sobre a implementação em mais do que um âmbito, veja:

As propriedades resourceGroup e subscription só são permitidas em módulos. Estas propriedades não são permitidas em recursos individuais. Utilize módulos se quiser implementar um recurso de extensão com o âmbito definido para um recurso num grupo de recursos diferente.

O exemplo seguinte mostra como aplicar um bloqueio numa conta de armazenamento que reside num grupo de recursos diferente.

  • 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.'
      }
    }
    

Passos seguintes

Para obter uma lista completa dos tipos de recursos de extensão, veja Tipos de recursos que expandem as capacidades de outros recursos.