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:

Para modelos aninhados que implementam em grupos de recursos, utilize:

Para criar novos grupos de recursos, utilize:

Para gerir a sua subscrição, utilize:

Para monitorização, utilize:

Para segurança, utilize:

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:

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 InvalidDeploymentLocationde 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: