Udostępnij przez


Ustawianie zakresu dla zasobów rozszerzeń w aplikacji Bicep

Zasób rozszerzenia to zasób, który modyfikuje inny zasób. Można na przykład 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 rozszerzenia 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.

Stosowanie w zakresie wdrożenia

Aby zastosować typ zasobu rozszerzenia w docelowym zakresie wdrażania, 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@2020-05-01' = {
  name: 'rgLock'
  properties: {
    level: 'CanNotDelete'
    notes: 'Resource group should not be deleted.'
  }
}

W następnym przykładzie przypisano rolę do subskrypcji, do niej wdrożonej.

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@2022-04-01' = {
  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 właściwości scope. 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 magazynowe 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@2025-06-01' = {
  name: uniqueStorageName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'Storage'
  properties: {}
}

resource roleAssignStorage 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  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@2025-06-01' existing = {
  name: 'examplestore'
}

resource createStorageLock 'Microsoft.Authorization/locks@2020-05-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ę konta magazynowego, 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@2023-05-01' existing = {
      name: storageAccountName
    }
    
    resource storeLock 'Microsoft.Authorization/locks@2020-05-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.