Implementações de subscrição com ficheiros Bicep
Para simplificar a gestão de recursos, pode implementar recursos ao nível da sua subscrição do Azure. Por exemplo, pode implementar políticas e controlo de acesso baseado em funções do Azure (RBAC do Azure) na sua subscrição, que as aplica em toda a sua subscrição.
Este artigo descreve como definir o âmbito de implementação para uma subscrição num ficheiro Bicep.
Nota
Pode implementar em 800 grupos de recursos diferentes numa implementação ao nível da subscrição.
Recursos de preparação
Se preferir saber mais sobre os âmbitos de implementação através da documentação de orientação passo a passo, veja Implementar recursos em subscrições, grupos de gestão e inquilinos com o Bicep.
Recursos suportados
Nem todos os tipos de recursos podem ser implementados ao nível da subscrição. Esta secção lista os tipos de recursos suportados.
Para o Azure Blueprints, utilize:
Para políticas do Azure, utilize:
Para controlo de acesso, utilize:
- accessReviewScheduleDefinitions
- accessReviewScheduleSettings
- roleAssignments
- roleAssignmentScheduleRequests
- roleDefinitions
- roleEligibilityScheduleRequests
- roleManagementPolicyAssignments
Para modelos aninhados que implementam em grupos de recursos, utilize:
Para criar novos grupos de recursos, utilize:
Para gerir a sua subscrição, utilize:
- orçamentos
- configurações - Assistente
- lineOfCredit
- bloqueios
- perfil - Análise de Alterações
- supportPlanTypes
- etiquetas
Para monitorização, utilize:
Para segurança, utilize:
- advancedThreatProtectionSettings
- alertsSuppressionRules
- assessmentMetadata
- avaliações
- autoProvisioningSettings
- conectores
- deviceSecurityGroups
- ingestionSettings
- preços
- securityContacts
- definições
- workspaceSettings
Outros tipos suportados incluem:
Definir âmbito
Para definir o âmbito para a subscrição, utilize:
targetScope = 'subscription'
Comandos de implementação
Para implementar numa subscrição, utilize os comandos de implementação ao nível da subscrição.
Para a CLI do Azure, utilize az deployment sub create. O exemplo seguinte implementa um modelo para criar um grupo de recursos:
az deployment sub create \
--name demoSubDeployment \
--location centralus \
--template-file main.bicep \
--parameters rgName=demoResourceGroup rgLocation=centralus
Para obter informações mais detalhadas sobre os comandos de implementação e as opções para implementar modelos do ARM, consulte:
- Implementar recursos com modelos arm e a CLI do Azure
- Implementar recursos com modelos arm e Azure PowerShell
- Implementar modelos do ARM a partir de Cloud Shell
Localização e nome da implementação
Para implementações ao nível da subscrição, tem de fornecer uma localização para a implementação. A localização da implementação é separada da localização dos recursos que implementar. A localização da implementação especifica onde armazenar dados de implementação. O grupo de gestão e as implementações de inquilinos também necessitam de uma localização. Para implementações de grupos de recursos , a localização do grupo de recursos é utilizada para armazenar os dados de implementação.
Pode fornecer um nome para a implementação ou utilizar o nome de implementação predefinido. O nome predefinido é o nome do ficheiro de modelo. Por exemplo, implementar um modelo com o nome main.json cria um nome de implementação predefinido principal.
Para cada nome de implementação, a localização é imutável. Não pode criar uma implementação numa localização quando existe uma implementação com o mesmo nome numa localização diferente. Por exemplo, se criar uma implementação de subscrição com o nome deployment1 no centrous, não poderá criar mais tarde outra implementação com o nome deployment1 , mas sim uma localização de westus. Se receber o código InvalidDeploymentLocation
de erro , utilize um nome diferente ou a mesma localização da implementação anterior para esse nome.
Âmbitos de implementação
Ao implementar numa subscrição, pode implementar recursos para:
- a subscrição de destino da operação
- qualquer subscrição no inquilino
- grupos de recursos na subscrição ou noutras subscrições
- o inquilino da subscrição
Um recurso de extensão pode ser confinado a um destino diferente do destino de implementação.
O utilizador que está a implementar o modelo tem de ter acesso ao âmbito especificado.
Âmbito da subscrição
Para implementar recursos na subscrição de destino, adicione esses recursos com a resource
palavra-chave.
targetScope = 'subscription'
// resource group created in target subscription
resource exampleResource 'Microsoft.Resources/resourceGroups@2022-09-01' = {
...
}
Para obter exemplos de implementação na subscrição, veja Criar grupos de recursos com o Bicep e Atribuir definição de política.
Para implementar recursos numa subscrição diferente da subscrição da operação, adicione um módulo. Utilize a função de subscrição para definir a scope
propriedade . Indique a subscriptionId
propriedade para o ID da subscrição na qual pretende implementar.
targetScope = 'subscription'
param otherSubscriptionID string
// module deployed at subscription level but in a different subscription
module exampleModule 'module.bicep' = {
name: 'deployToDifferentSub'
scope: subscription(otherSubscriptionID)
}
Âmbito para grupo de recursos
Para implementar recursos num grupo de recursos na subscrição, adicione um módulo e defina a respetiva scope
propriedade. Se o grupo de recursos já existir, utilize a função resourceGroup para definir o valor de âmbito. Indique o nome do grupo de recursos.
targetScope = 'subscription'
param resourceGroupName string
module exampleModule 'module.bicep' = {
name: 'exampleModule'
scope: resourceGroup(resourceGroupName)
}
Se o grupo de recursos for criado no mesmo ficheiro Bicep, utilize o nome simbólico do grupo de recursos para definir o valor de âmbito. Para obter um exemplo de definição do âmbito para o nome simbólico, veja Criar grupo de recursos com o Bicep.
Âmbito para inquilino
Para criar recursos no inquilino, adicione um módulo. Utilize a função de inquilino para definir a respetiva scope
propriedade.
O utilizador que está a implementar o modelo tem de ter o acesso necessário para implementar no inquilino.
O exemplo seguinte inclui um módulo que é implementado no inquilino.
targetScope = 'subscription'
// module deployed at tenant level
module exampleModule 'module.bicep' = {
name: 'deployToTenant'
scope: tenant()
}
Em vez de utilizar um módulo, pode definir o âmbito como tenant()
para alguns tipos de recursos. O exemplo seguinte implementa um grupo de gestão no inquilino.
targetScope = 'subscription'
param mgName string = 'mg-${uniqueString(newGuid())}'
// management group created at tenant
resource managementGroup 'Microsoft.Management/managementGroups@2021-04-01' = {
scope: tenant()
name: mgName
properties: {}
}
output output string = mgName
Para obter mais informações, veja Grupo de gestão.
Grupos de recursos
Para obter informações sobre a criação de grupos de recursos, veja Criar um grupo de recursos com o Bicep.
Azure Policy
Atribuir definição de política
O exemplo seguinte atribui uma definição de política existente à subscrição. Se a definição de política utilizar parâmetros, forneça-os como um objeto. Se a definição de política não utilizar parâmetros, utilize o objeto vazio predefinido.
targetScope = 'subscription'
param policyDefinitionID string
param policyName string
param policyParameters object = {}
resource policyAssign 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
name: policyName
properties: {
policyDefinitionId: policyDefinitionID
parameters: policyParameters
}
}
Criar e atribuir definições de política
Pode definir e atribuir uma definição de política no mesmo ficheiro Bicep.
targetScope = 'subscription'
resource locationPolicy 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
name: 'locationpolicy'
properties: {
policyType: 'Custom'
parameters: {}
policyRule: {
if: {
field: 'location'
equals: 'northeurope'
}
then: {
effect: 'deny'
}
}
}
}
resource locationRestrict 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
name: 'allowedLocation'
properties: {
policyDefinitionId: locationPolicy.id
}
}
Controlo de acesso
Para saber mais sobre a atribuição de funções, veja Adicionar atribuições de funções do Azure com modelos do Azure Resource Manager.
O exemplo seguinte cria um grupo de recursos, aplica um bloqueio ao mesmo e atribui uma função a um principal.
targetScope = 'subscription'
@description('Name of the resourceGroup to create')
param resourceGroupName string
@description('Location for the resourceGroup')
param resourceGroupLocation string
@description('principalId of the user that will be given contributor access to the resourceGroup')
param principalId string
@description('roleDefinition to apply to the resourceGroup - default is contributor')
param roleDefinitionId string = 'b24988ac-6180-42a0-ab88-20f7382dd24c'
@description('Unique name for the roleAssignment in the format of a guid')
param roleAssignmentName string = guid(principalId, roleDefinitionId, resourceGroupName)
var roleID = '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/${roleDefinitionId}'
resource newResourceGroup 'Microsoft.Resources/resourceGroups@2022-09-01' = {
name: resourceGroupName
location: resourceGroupLocation
properties: {}
}
module applyLock 'lock.bicep' = {
name: 'applyLock'
scope: newResourceGroup
}
module assignRole 'role.bicep' = {
name: 'assignRBACRole'
scope: newResourceGroup
params: {
principalId: principalId
roleNameGuid: roleAssignmentName
roleDefinitionId: roleID
}
}
O exemplo seguinte mostra o módulo para aplicar o bloqueio:
resource createRgLock 'Microsoft.Authorization/locks@2020-05-01' = {
name: 'rgLock'
properties: {
level: 'CanNotDelete'
notes: 'Resource group should not be deleted.'
}
}
O exemplo seguinte mostra o módulo para atribuir a função:
@description('The principal to assign the role to')
param principalId string
@description('A GUID used to identify the role assignment')
param roleNameGuid string = newGuid()
param roleDefinitionId string
resource roleNameGuid_resource 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: roleNameGuid
properties: {
roleDefinitionId: roleDefinitionId
principalId: principalId
}
}
Passos seguintes
Para saber mais sobre outros âmbitos, veja: