Ustawianie zakresu dla zasobów rozszerzeń w usłudze Bicep

Zasób rozszerzenia to zasób, który modyfikuje inny zasób. Na przykład można przypisać rolę do zasobu. Przypisanie roli jest typem zasobu rozszerzenia.

Aby uzyskać pełną listę typów zasobów rozszerzeń, zobacz Typy zasobów, które rozszerzają możliwości innych zasobów.

W tym artykule pokazano, jak ustawić zakres dla typu zasobu rozszerzenia podczas wdrażania z plikiem Bicep. Opisuje on właściwość zakresu, która jest dostępna dla zasobów rozszerzeń podczas stosowania do zasobu.

Uwaga

Właściwość zakresu jest dostępna tylko dla typów zasobów rozszerzeń. Aby określić inny zakres dla typu zasobu, który nie jest typem rozszerzenia, użyj modułu.

Zasoby szkoleniowe

Jeśli wolisz dowiedzieć się więcej o zasobach rozszerzeń za pomocą szczegółowych wskazówek, zobacz Wdrażanie zasobów podrzędnych i zasobów rozszerzeń przy użyciu Bicep.

Stosowanie w zakresie wdrożenia

Aby zastosować typ zasobu rozszerzenia w docelowym zakresie wdrożenia, dodaj zasób do szablonu tak, jak w przypadku dowolnego innego typu zasobu. Dostępne zakresy to grupa zasobów, subskrypcja, grupa zarządzania i dzierżawa. Zakres wdrożenia musi obsługiwać typ zasobu.

Po wdrożeniu w grupie zasobów poniższy szablon dodaje blokadę do tej grupy zasobów.

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

W następnym przykładzie przypisano rolę do subskrypcji, w ramach których została wdrożona.

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

Zastosuj do zasobu

Aby zastosować zasób rozszerzenia do zasobu, użyj scope właściwości . We właściwości zakresu odwołaj się do zasobu, do którego dodajesz rozszerzenie. Odwołujesz się do zasobu, podając symboliczną nazwę zasobu. Właściwość zakresu jest właściwością główną dla typu zasobu rozszerzenia.

Poniższy przykład tworzy konto magazynu i stosuje do niego rolę.

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

Zasób rozszerzenia można zastosować do istniejącego zasobu. W poniższym przykładzie dodano blokadę do istniejącego konta magazynu.

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

Te same wymagania dotyczą zasobów rozszerzeń co inny zasób w przypadku określania zakresu innego niż docelowy zakres wdrożenia. Aby dowiedzieć się więcej o wdrażaniu w więcej niż jednym zakresie, zobacz:

Właściwości resourceGroup i subscription są dozwolone tylko w modułach. Te właściwości nie są dozwolone dla poszczególnych zasobów. Użyj modułów, jeśli chcesz wdrożyć zasób rozszerzenia z zakresem ustawionym na zasób w innej grupie zasobów.

W poniższym przykładzie pokazano, jak zastosować blokadę na koncie magazynu, które znajduje się w innej grupie zasobów.

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

Następne kroki

Aby uzyskać pełną listę typów zasobów rozszerzeń, zobacz Typy zasobów, które rozszerzają możliwości innych zasobów.