Bereik instellen voor extensieresources in Bicep

Een extensieresource is een resource die een andere resource wijzigt. U kunt bijvoorbeeld een rol toewijzen aan een resource. De roltoewijzing is een extensieresourcetype.

Zie Resourcetypen waarmee de mogelijkheden van andere resources worden uitgebreid voor een volledige lijst met extensieresourcetypen.

In dit artikel wordt beschreven hoe u het bereik voor een extensieresourcetype instelt wanneer deze wordt geïmplementeerd met een Bicep-bestand. Hierin wordt de bereikeigenschap beschreven die beschikbaar is voor extensieresources bij het toepassen op een resource.

Notitie

De bereikeigenschap is alleen beschikbaar voor extensieresourcetypen. Als u een ander bereik wilt opgeven voor een resourcetype dat geen extensietype is, gebruikt u een module.

Training en bronnen

Zie Onderliggende en extensieresources implementeren met behulp van Bicep als u liever meer wilt weten over extensieresources via stapsgewijze instructies.

Toepassen op implementatiebereik

Als u een extensieresourcetype wilt toepassen op het doelimplementatiebereik, voegt u de resource toe aan uw sjabloon, net als bij elk ander resourcetype. De beschikbare bereiken zijn resourcegroep, abonnement, beheergroep en tenant. Het implementatiebereik moet het resourcetype ondersteunen.

Wanneer deze wordt geïmplementeerd in een resourcegroep, voegt de volgende sjabloon een vergrendeling toe aan die resourcegroep.

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

In het volgende voorbeeld wordt een rol toegewezen aan het abonnement waarvoor het is geïmplementeerd.

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

Toepassen op resource

Gebruik de scope eigenschap om een extensieresource toe te passen op een resource. Verwijst in de bereikeigenschap naar de resource waaraan u de extensie toevoegt. U verwijst naar de resource door de symbolische naam voor de resource op te geven. De bereikeigenschap is een hoofdeigenschap voor het extensieresourcetype.

In het volgende voorbeeld wordt een opslagaccount gemaakt en hierop een rol toegepast.

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

U kunt een extensieresource toepassen op een bestaande resource. In het volgende voorbeeld wordt een vergrendeling toegevoegd aan een bestaand opslagaccount.

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

Dezelfde vereisten zijn van toepassing op extensieresources als andere resources wanneer ze zich richten op een ander bereik dan het doelbereik van de implementatie. Zie voor meer informatie over het implementeren naar meer dan één bereik:

De eigenschappen resourceGroup en abonnement zijn alleen toegestaan voor modules. Deze eigenschappen zijn niet toegestaan voor afzonderlijke resources. Gebruik modules als u een extensieresource wilt implementeren waarbij het bereik is ingesteld op een resource in een andere resourcegroep.

In het volgende voorbeeld ziet u hoe u een vergrendeling toepast op een opslagaccount dat zich in een andere resourcegroep bevindt.

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

Volgende stappen

Zie Resourcetypen waarmee de mogelijkheden van andere resources worden uitgebreid voor een volledige lijst met extensieresourcetypen.