Definir o escopo de recursos de extensão no Bicep
Um recurso de extensão é um recurso que modifica outro recurso. Por exemplo, você pode atribuir uma função a um recurso. A atribuição de função é um tipo de recurso de extensão.
Para obter uma lista completa dos tipos de recursos de extensão, veja Tipos de recursos que estendem as funcionalidades de outros recursos.
Este artigo mostra como definir o escopo de um tipo de recurso de extensão implantado com um arquivo Bicep. Descreve a propriedade de escopo que está disponível para recursos de extensão ao aplicar a um recurso.
Observação
A propriedade de escopo só está disponível para tipos de recursos de extensão. Para especificar um escopo diferente para um tipo de recurso que não seja um tipo de extensão, use um módulo.
Recursos de treinamento
Se você preferir aprender sobre recursos de extensão por orientações passo a passo, confira Implantar recursos filho e de extensão usando o Bicep.
Aplicar no escopo da implantação
Para aplicar um tipo de recurso de extensão no escopo da implantação de destino, você adiciona o recurso ao modelo, como faria com qualquer outro tipo de recurso. Os escopos disponíveis são grupo de recursos, assinatura, grupo de gerenciamentoe locatário. O escopo de implantação deve dar suporte ao tipo de recurso.
Quando implantado em um grupo de recursos, o modelo a seguir adiciona um bloqueio a esse grupo de recursos.
resource createRgLock 'Microsoft.Authorization/locks@2020-05-01' = {
name: 'rgLock'
properties: {
level: 'CanNotDelete'
notes: 'Resource group should not be deleted.'
}
}
O próximo exemplo atribui uma função à assinatura na qual está implantada.
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
}
}
Aplicar ao recurso
Para aplicar um recurso de extensão a um recurso, use a propriedade scope
. Na propriedade do escopo, consulte o recurso ao qual você está adicionando a extensão. Você faz referência ao recurso fornecendo o nome simbólico para o recurso. A propriedade de escopo é uma propriedade raiz para o tipo de recurso de extensão.
O exemplo a seguir cria uma conta de armazenamento e aplica uma função a ela.
@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@2023-04-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
}
Você pode aplicar um recurso de extensão a um recurso existente. O exemplo a seguir adiciona um bloqueio a uma conta de armazenamento existente.
resource demoStorageAcct 'Microsoft.Storage/storageAccounts@2023-04-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.'
}
}
Os mesmos requisitos se aplicam aos recursos de extensão que outro recurso ao direcionar um escopo diferente do escopo de destino da implantação. Para saber mais sobre como implantar em mais de um escopo, confira:
- Implantações do grupo de recursos
- Implantações da assinatura
- Implantações do grupo de gerenciamento
- Implantações de locatário
As propriedades resourceGroup e subscription só são permitidas em módulos. Essas propriedades não são permitidas em recursos individuais. Use módulos se quiser implantar um recurso de extensão com o escopo definido como um recurso em um grupo de recursos diferente.
O exemplo a seguir mostra como aplicar um bloqueio em uma conta de armazenamento que reside em um grupo de recursos diferente.
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-04-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.' } }
Próximas etapas
Para obter uma lista completa dos tipos de recursos de extensão, veja Tipos de recursos que estendem as funcionalidades de outros recursos.