Festlegen des Bereichs für Erweiterungsressourcen in Bicep

Eine Erweiterungsressource ist eine Ressource, die eine andere Ressource ändert. Sie können beispielsweise einer Ressource eine Rolle zuweisen. Die Rollenzuweisung ist ein Erweiterungsressourcentyp.

Eine vollständige Liste der Erweiterungsressourcentypen finden Sie unter Ressourcentypen, die Funktionen anderer Ressourcen erweitern.

In diesem Artikel wird gezeigt, wie Sie den Bereich für einen Erweiterungsressourcentyp festlegen, wenn dieser mit einer Bicep-Datei bereitgestellt wird. Außerdem wird die Bereichseigenschaft beschrieben, die für Erweiterungsressourcen beim Anwenden auf eine Ressource verfügbar ist.

Hinweis

Die Bereichseigenschaft ist nur für Erweiterungsressourcentypen verfügbar. Wenn Sie einen anderen Bereich für einen Ressourcentyp angeben möchten, der kein Erweiterungstyp ist, verwenden Sie ein Modul.

Schulungsressourcen

Wenn Sie sich lieber in einer Schritt-für-Schritt-Anleitung über Erweiterungsressourcen informieren möchten, finden Sie weitere Informationen unter Bereitstellen von untergeordneten Ressourcen und Erweiterungsressourcen mithilfe von Bicep.

Anwenden im Bereitstellungsumfang

Fügen Sie die Ressource wie bei jedem anderen Ressourcentyp zu Ihrer Vorlage hinzu, um einen Erweiterungsressourcentyp im Zielbereitstellungsumfang anzuwenden. Die verfügbaren Bereiche sind Ressourcengruppe, Abonnement, Verwaltungsgruppe und Mandant. Der Bereitstellungsbereich muss den Ressourcentyp unterstützen.

Bei der Bereitstellung in einer Ressourcengruppe fügt die folgende Vorlage dieser Ressourcengruppe eine Sperre hinzu.

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

Im nächsten Beispiel wird dem Abonnement, für das sie bereitgestellt wird, eine Rolle zugewiesen.

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

Anwenden auf die Ressource

Verwenden Sie die scope-Eigenschaft, um eine Erweiterungsressource auf eine Ressource anzuwenden. Verweisen Sie in der Bereichseigenschaft auf die Ressource, der Sie die Erweiterung hinzufügen möchten. Sie verweisen auf die Ressource, indem Sie den symbolischen Namen für die Ressource angeben. Die Bereichseigenschaft ist eine Stammeigenschaft für den Erweiterungsressourcentyp.

Im folgenden Beispiel wird ein Speicherkonto erstellt und eine Rolle darauf angewendet.

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

Sie können eine Erweiterungsressource auf eine vorhandene Ressource anwenden. Im folgenden Beispiel wird einem vorhandenen Speicherkonto eine Sperre hinzugefügt.

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

Die gleichen Anforderungen gelten für Erweiterungsressourcen wie für andere Ressourcen, wenn sich der als Ziel festgelegte Bereich und der Zielbereich der Bereitstellung unterscheiden. Informationen zur Bereitstellung in mehr als einem Bereich finden Sie unter:

Die Eigenschaften „resourceGroup“ und „Abonnement“ sind nur für Module zulässig. Diese Eigenschaften sind für einzelne Ressourcen nicht zulässig. Verwenden Sie Module, wenn Sie eine Erweiterungsressource mit dem Bereich bereitstellen möchten, der auf eine Ressource in einer anderen Ressourcengruppe festgelegt ist.

Das folgende Beispiel zeigt, wie Sie eine Sperre auf ein Speicherkonto anwenden, das sich in einer anderen Ressourcengruppe befindet.

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

Nächste Schritte

Eine vollständige Liste der Erweiterungsressourcentypen finden Sie unter Ressourcentypen, die Funktionen anderer Ressourcen erweitern.