Implantações de locatário com o arquivo Bicep

À medida que sua organização amadurece, talvez seja necessário definir e atribuir políticas ou RBAC do Azure (controle de acesso baseado em função do Azure) no seu locatário do Microsoft Entra. Com os modelos de nível de locatário, você pode aplicar políticas declarativamente e atribuir funções em um nível global.

Recursos de treinamento

Se você quiser saber mais sobre os escopos de implantação por meio de diretrizes passo a passo, confira Implantar recursos em assinaturas, grupos de gerenciamento e locatários usando o Bicep.

Recursos compatíveis

Nem todos os tipos de recursos podem ser implantados no nível de locatário. Esta seção lista os tipos de recursos compatíveis.

Para o RBAC do Azure (controle de acesso baseado em função do Azure), use:

Para modelos aninhados que são implantados em grupos de gerenciamento, assinaturas ou grupos de recursos, use:

Para criar grupos de gerenciamento, use:

Para criar assinaturas, use:

Para gerenciar custos, use:

Para configurar o portal, use:

As definições de política internas são recursos no nível do locatário, mas você não pode implantar definições de política personalizadas no locatário. Para ver um exemplo de como atribuir uma definição de política interna a um recurso, consulte amostra tenantResourceId.

Escopo de conjunto

Para definir o escopo como locatário, use:

targetScope = 'tenant'

Acesso necessário

A entidade de segurança que está implantando o modelo deve ter permissões para criar recursos no escopo do locatário. A entidade de segurança deve ter permissão para executar as ações de implantação (Microsoft.Resources/deployments/*) e para criar os recursos definidos no modelo. Por exemplo, para criar um grupo de gerenciamento, a entidade de segurança deve ter permissão de colaborador no escopo do locatário. Para criar atribuições de função, a entidade de segurança deve ter permissão de proprietário.

O Administrador Global do Microsoft Entra ID não tem permissão automática para atribuir funções. Para habilitar implantações de modelo no escopo do locatário, o administrador global deve executar as seguintes etapas:

  1. Eleve o acesso à conta para que o administrador global possa atribuir funções. Para obter mais informações, confira Elevar o acesso para gerenciar todas as assinaturas e grupos de gerenciamento do Azure.

  2. Atribua o proprietário ou colaborador à entidade de segurança que precisa implantar os modelos.

    New-AzRoleAssignment -SignInName "[userId]" -Scope "/" -RoleDefinitionName "Owner"
    
    az role assignment create --assignee "[userId]" --scope "/" --role "Owner"
    

O principal agora tem as permissões necessárias para implantar o modelo.

Comandos de implantação

Os comandos para implantações de locatário são diferentes dos comandos para implantações do grupo de recursos.

Para CLI do Azure, use az deployment tenant create:

az deployment tenant create \
  --name demoTenantDeployment \
  --location WestUS \
  --template-file main.bicep

Para obter informações mais detalhadas sobre os comandos de implantação e as opções para implantar modelos do ARM, confira:

Nome e local da implantação

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

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

O local não pode ser alterado para cada nome de implantação. Você não pode 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 locatário com o nome deployment1 em centralus, não poderá criar outra implantação mais tarde com o nome deployment1, mas um local de westus. Se você receber o código de erro InvalidDeploymentLocation, use um nome diferente ou o mesmo local que a implantação anterior para esse nome.

Escopos de implantação

Ao implantar em um locatário, você pode implantar recursos em:

  • locatário
  • grupos de gerenciamento dentro do locatário
  • subscriptions
  • grupos de recursos

É possível definir o escopo de um recurso de extensão para um destino diferente do destino de implantação.

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

Esta seção mostra como especificar escopos diferentes. Você pode combinar esses escopos diferentes em um só modelo.

Escopo de locatário

Recursos definidor dentro do arquivo Bicep são aplicados ao locatário.

targetScope = 'tenant'

// create resource at tenant
resource mgName_resource 'Microsoft.Management/managementGroups@2021-04-01' = {
  ...
}

Escopo do grupo de gerenciamento

Para direcionar um grupo de gerenciamento dentro do locatário, adicione um módulo. Use a função managementGroup para definir sua propriedade scope. Forneça o nome do grupo de gerenciamento.

targetScope = 'tenant'

param managementGroupName string

// create resources at management group level
module  'module.bicep' = {
  name: 'deployToMG'
  scope: managementGroup(managementGroupName)
}

Escopo de assinatura

Para direcionar uma assinatura dentro do locatário, adicione um módulo. Use a função de assinatura para definir sua propriedade scope. Forneça a ID da assinatura.

targetScope = 'tenant'

param subscriptionID string

// create resources at subscription level
module  'module.bicep' = {
  name: 'deployToSub'
  scope: subscription(subscriptionID)
}

Escopo de grupo de recursos

Para direcionar um grupo de recursos dentro do locatário, adicione um módulo. Use a função resourceGroup para definir sua propriedade scope. Forneça a ID da assinatura e o nome do grupo de recursos.

targetScope = 'tenant'

param resourceGroupName string
param subscriptionID string

// create resources at resource group level
module  'module.bicep' = {
  name: 'deployToRG'
  scope: resourceGroup(subscriptionID, resourceGroupName)
}

Criar grupo de gerenciamento

O modelo a seguir cria um grupo de recursos vazio.

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

resource mgName_resource 'Microsoft.Management/managementGroups@2021-04-01' = {
  name: mgName
  properties: {}
}

Se sua conta não tiver permissão para implantar no locatário, você ainda poderá criar grupos de gerenciamento implantando em outro escopo. Para obter mais informações, veja Grupo de gerenciamento.

Atribuir função

O modelo a seguir atribui uma função no escopo do locatário.

targetScope = 'tenant'

@description('principalId of the user that will be given contributor access to the resourceGroup')
param principalId string

@description('roleDefinition for the assignment - default is owner')
param roleDefinitionId string = '8e3af657-a8ff-443c-a75c-2fe8c4bcb635'

var roleAssignmentName = guid(principalId, roleDefinitionId)

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: roleAssignmentName
  properties: {
    roleDefinitionId: tenantResourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
    principalId: principalId
  }
}

Próximas etapas

Para saber mais sobre outros escopos, consulte: