Impostare l'ambito per le risorse di estensione in Bicep

Una risorsa di estensione è una risorsa che modifica un'altra risorsa. Ad esempio, è possibile assegnare un ruolo a una risorsa. L'assegnazione di ruolo è un tipo di risorsa di estensione.

Per un elenco completo dei tipi di risorse di estensione, vedere Tipi di risorse che estendono le funzionalità di altre risorse.

Questo articolo spiega come impostare l'ambito per un tipo di risorsa di estensione quando viene distribuito con un file Bicep. Descrive la proprietà Scope disponibile per le risorse di estensione quando si applica a una risorsa.

Nota

La proprietà scope è disponibile solo per i tipi di risorse di estensione. Per specificare un ambito diverso per un tipo di risorsa che non è un tipo di estensione, usare un modulo.

Risorse di formazione

Per avere informazioni più dettagliate sulle risorse di estensione, vedere Distribuire risorse figlio e di estensione usando Bicep.

Applicare all'ambito di distribuzione

Per applicare un tipo di risorsa di estensione all'ambito della distribuzione di destinazione, aggiungere la risorsa al modello come si farebbe con qualsiasi altro tipo di risorsa. Gli ambiti disponibili sono gruppo di risorse, sottoscrizione, gruppo di gestione e tenant. L'ambito di distribuzione deve supportare il tipo di risorsa.

Quando viene distribuito in un gruppo di risorse, il modello seguente aggiunge un blocco a questo gruppo di risorse.

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

Nell'esempio che segue viene assegnato un ruolo alla sottoscrizione in cui viene distribuito.

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

Applicare alla risorsa

Per applicare una risorsa di estensione a una risorsa, usare la proprietà scope. Nella proprietà scope fare riferimento alla risorsa a cui si aggiunge l'estensione. Fare riferimento alla risorsa specificando il nome simbolico per la risorsa. La proprietà scope è una proprietà radice per il tipo di risorsa di estensione.

Nell'esempio seguente viene creato un account di archiviazione e gli si applica un ruolo.

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

È possibile applicare una risorsa di estensione a una risorsa esistente. Nell'esempio seguente viene aggiunto un blocco ad un account di archiviazione esistente.

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

Alle risorse di estensione si applicano gli stessi requisiti di altre risorse quando si mira a un ambito diverso dall'ambito di destinazione della distribuzione. Per informazioni sulla distribuzione in più ambiti, vedere:

Le proprietà gruppo di risorse e sottoscrizione sono consentite solo nei moduli. Queste proprietà non sono consentite per le singole risorse. Usare i moduli se si vuole distribuire una risorsa di estensione con l'ambito impostato su una risorsa in un gruppo di risorse diverso.

L'esempio seguente mostra come applicare un blocco a un account di archiviazione che si trova in un gruppo di risorse diverso.

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

Passaggi successivi

Per un elenco completo dei tipi di risorse di estensione, vedere Tipi di risorse che estendono le funzionalità di altre risorse.