Bicep'te uzantı kaynaklarının kapsamını ayarlama

Uzantı kaynağı, başka bir kaynağı değiştiren bir kaynaktır. Örneğin, bir kaynağa rol atayabilirsiniz. Rol ataması bir uzantı kaynak türüdür.

Uzantı kaynak türlerinin tam listesi için bkz. Diğer kaynakların özelliklerini genişleten kaynak türleri.

Bu makalede, Bicep dosyasıyla dağıtıldığında uzantı kaynak türünün kapsamının nasıl ayarlanacağı gösterilmektedir. Bir kaynağa uygulanırken uzantı kaynakları için kullanılabilen kapsam özelliğini açıklar.

Uyarı

Kapsam özelliği yalnızca uzantı kaynak türleri için kullanılabilir. Uzantı türü olmayan bir kaynak türü için farklı bir kapsam belirtmek için modül kullanın.

Dağıtım kapsamına uygula

Hedef dağıtım kapsamında bir uzantı kaynak türü uygulamak için, kaynağı diğer kaynak türlerinde olduğu gibi şablonunuza ekleyin. Kullanılabilir kapsamlar kaynak grubu, abonelik, yönetim grubu ve kiracıdır. Dağıtım kapsamı kaynak türünü desteklemelidir.

Bir kaynak grubuna dağıtıldığında, aşağıdaki şablon bu kaynak grubuna bir kilit ekler.

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

Sonraki örnek, dağıtılacağı aboneliğe bir rol atar.

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

Kaynağa başvur

Bir kaynağa uzantıyı uygulamak için scope özelliğini kullanın. kapsam özelliğinde uzantıyı eklediğiniz kaynağa başvurun. Kaynağın sembolik adını sağlayarak kaynağa başvurursunuz. Kapsam özelliği, uzantı kaynak türü için bir kök özelliktir.

Aşağıdaki örnek bir depolama hesabı oluşturur ve buna bir rol uygular.

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

Var olan bir kaynağa uzantı kaynağı uygulayabilirsiniz. Aşağıdaki örnek, mevcut bir depolama hesabına kilit ekler.

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

Ayrıca, bir eklenti kaynağını başka bir uzantı kaynağına da uygulayarak bu scope özelliği o uzantı kaynağının sembolik adı olarak ayarlayabilirsiniz. Aşağıdaki örnek, mevcut bir rol atamasına kilit uygular.

resource existingRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' existing = {
  name: '00000000-0000-0000-0000-000000000000'
}

resource roleAssignmentLock 'Microsoft.Authorization/locks@2020-05-01' = {
  name: 'roleAssignmentLock'
  scope: existingRoleAssignment
  properties: {
    level: 'CanNotDelete'
    notes: 'Role assignment should not be deleted.'
  }
}

Herhangi bir kaynak bu scope özelliği kullandığında, Bicep kapsam için tam nitelikli kaynak kimliğini oluşturur. Bu, derlenmiş ARM şablonunun , tam nitelikli bir kaynak kimliğini ilk argüman olarak gerektiren kapsamı doğru extensionResourceIdşekilde çözmesini sağlar. Bu davranış, genişletme kaynakları ve bu scope özelliği kullanan diğer tüm kaynak türleri için geçerlidir. Ayrıca, daha önce desteklenmeyen dağıtım senaryolarını da mümkün kılar; örneğin abonelik veya kaynak grubu gibi daha düşük dağıtım alanlarından kiracı düzeyindeki kaynakların dağıtımı gibi.

Dağıtım için hedeflenen kapsamdan farklı bir kapsam hedef alındığında, uzantı kaynakları ve diğer kaynaklar ile aynı gereksinimler geçerlidir. Birden fazla kapsama dağıtma hakkında bilgi edinmek için bkz:

resourceGroup ve abonelik özelliklerine yalnızca modüllerde izin verilir. Bu özelliklere her bir kaynakta izin verilmez. Kapsamı farklı bir kaynak grubundaki bir kaynağa ayarlanmış bir uzantı kaynağı dağıtmak istiyorsanız modülleri kullanın.

Aşağıdaki örnekte, farklı bir kaynak grubunda bulunan bir depolama hesabına nasıl kilit uygulanacağı gösterilmektedir.

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

Sonraki adımlar

Uzantı kaynak türlerinin tam listesi için bkz. Diğer kaynakların özelliklerini genişleten kaynak türleri.