Partilhar via


Implantações de assinatura com arquivos Bicep

Para simplificar o gerenciamento de recursos, você pode implantar recursos no nível de sua assinatura do Azure. Por exemplo, você pode implantar políticas e o controle de acesso baseado em função do Azure (Azure RBAC) à sua assinatura, que as aplica em toda a sua assinatura.

Este artigo descreve como definir o escopo de implantação para uma assinatura em um arquivo Bicep.

Nota

Você pode implantar em 800 grupos de recursos diferentes em uma implantação de nível de assinatura.

Recursos de formação

Se preferir saber mais sobre escopos de implantação por meio de orientação passo a passo, consulte Implantar recursos para assinaturas, grupos de gerenciamento e locatários usando o Bicep.

Recursos suportados

Nem todos os tipos de recursos podem ser implantados no nível de assinatura. Esta seção lista quais tipos de recursos são suportados.

Para Azure Blueprints, use:

Para Políticas do Azure, use:

Para controle de acesso, use:

Para modelos aninhados que implantam em grupos de recursos, use:

Para criar novos grupos de recursos, use:

Para gerenciar sua assinatura, use:

Para monitorização, utilize:

Por segurança, use:

Outros tipos suportados incluem:

Definir âmbito

Para definir o escopo como assinatura, use:

targetScope = 'subscription'

Comandos de implantação

Para implantar em uma assinatura, use os comandos de implantação no nível de assinatura.

Para a CLI do Azure, use az deployment sub create. O exemplo a seguir implanta 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 comandos de implantação e opções para implantar modelos ARM, consulte:

Local e nome da implantação

Para implantações de nível de assinatura, você deve fornecer um local para a implantação. O local da implantação é separado do local dos recursos implantados. O local de implantação especifica onde armazenar os dados de implantação. As implantações de grupo de gerenciamento e locatário também exigem um local. Para implantações de grupo de recursos, o local do grupo de recursos é usado para armazenar os dados de implantação.

Você pode fornecer um nome para a implantação ou usar o nome de implantação padrão. O nome padrão é o nome do arquivo de modelo. Por exemplo, implantar um modelo chamado main.json cria um nome de implantação padrão de principal.

Para cada nome de implantação, o local é imutável. Não é possível criar uma implantação em um local quando há uma implantação existente com o mesmo nome em um local diferente. Por exemplo, se você criar uma implantação de assinatura com o nome deployment1 no centralus, não poderá criar outra implantação posteriormente com o nome deployment1 , mas um local do westus. Se você receber o código InvalidDeploymentLocationde erro , use um nome diferente ou o mesmo local da implantação anterior para esse nome.

Escopos de implantação

Ao implantar em uma assinatura, você pode implantar recursos para:

  • a subscrição de destino da operação
  • qualquer subscrição no inquilino
  • grupos de recursos dentro da assinatura ou outras assinaturas
  • O inquilino da subscrição

Um recurso de extensão pode ter o escopo definido para um destino diferente do destino de implantação.

O usuário que implanta o modelo deve ter acesso ao escopo especificado.

Âmbito da subscrição

Para implantar recursos na assinatura de destino, adicione esses recursos com a resource palavra-chave.

targetScope = 'subscription'

// resource group created in target subscription
resource exampleResource 'Microsoft.Resources/resourceGroups@2024-03-01' = {
  ...
}

Para obter exemplos de implantação na assinatura, consulte Criar grupos de recursos com o Bíceps e Atribuir definição de política.

Para implantar recursos em uma assinatura diferente da assinatura da operação, adicione um módulo. Use a função de assinatura para definir a scope propriedade. Forneça a subscriptionId propriedade para a ID da assinatura na qual você deseja implantar.

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 do grupo de recursos

Para implantar recursos em um grupo de recursos dentro da assinatura, adicione um módulo e defina sua scope propriedade. Se o grupo de recursos já existir, use a função resourceGroup para definir o valor do escopo. Forneça 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 arquivo Bicep, use o nome simbólico do grupo de recursos para definir o valor do escopo. Para obter um exemplo de como definir o escopo para o nome simbólico, consulte Criar grupo de recursos com Bicep.

Âmbito de aplicação para o inquilino

Para criar recursos no locatário, adicione um módulo. Use a função tenant para definir sua scope propriedade.

O usuário que implanta o modelo deve ter o acesso necessário para implantar no locatário.

O exemplo a seguir inclui um módulo que é implantado para o locatário.

targetScope = 'subscription'

// module deployed at tenant level
module exampleModule 'module.bicep' = {
  name: 'deployToTenant'
  scope: tenant()
}

Em vez de usar um módulo, você pode definir o escopo para tenant() alguns tipos de recursos. O exemplo a seguir implanta um grupo de gerenciamento no locatário.

targetScope = 'subscription'

param mgName string = 'mg-${uniqueString(newGuid())}'

// management group created at tenant
resource managementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: mgName
  properties: {}
}

output output string = mgName

Para obter mais informações, consulte Grupo de gerenciamento.

Grupos de recursos

Para obter informações sobre como criar grupos de recursos, consulte Criar grupo de recursos com o Bicep.

Azure Policy

Atribuir definição de política

O exemplo a seguir atribui uma definição de política existente à assinatura. Se a definição de política usar parâmetros, forneça-os como um objeto. Se a definição de política não usar parâmetros, use o objeto vazio padrão.

targetScope = 'subscription'

param policyDefinitionID string
param policyName string
param policyParameters object = {}

resource policyAssign 'Microsoft.Authorization/policyAssignments@2024-04-01' = {
  name: policyName
  properties: {
    policyDefinitionId: policyDefinitionID
    parameters: policyParameters
  }
}

Criar e atribuir definições de política

Você pode definir e atribuir uma definição de política no mesmo arquivo Bicep.

targetScope = 'subscription'

resource locationPolicy 'Microsoft.Authorization/policyDefinitions@2023-04-01' = {
  name: 'locationpolicy'
  properties: {
    policyType: 'Custom'
    parameters: {}
    policyRule: {
      if: {
        field: 'location'
        equals: 'northeurope'
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource locationRestrict 'Microsoft.Authorization/policyAssignments@2024-04-01' = {
  name: 'allowedLocation'
  properties: {
    policyDefinitionId: locationPolicy.id
  }
}

Controlo de acesso

Para saber mais sobre como atribuir funções, consulte Adicionar atribuições de função do Azure usando modelos do Azure Resource Manager.

O exemplo a seguir cria um grupo de recursos, aplica um bloqueio a ele e atribui uma função a uma entidade de segurança.

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@2024-03-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 a seguir 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 próximo exemplo 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
  }
}

Próximos passos

Para saber mais sobre outros escopos, consulte: