Implantações de grupo de gerenciamento com arquivos Bicep

Este artigo descreve como definir o escopo com o Bicep ao implantar em um grupo de gerenciamento.

À medida que a sua organização amadurece, você pode implantar um arquivo Bicep para criar recursos no nível do grupo de gerenciamento. Por exemplo, talvez você precise definir e atribuir políticas ou o RBAC do Azure (controle de acesso baseado em função do Azure) para um grupo de gerenciamento. Com os modelos em nível de grupo de gerenciamento, você pode atribuir funções nesse mesmo nível e aplicar políticas declarativamente.

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 em nível de grupo de gerenciamento. Esta seção lista os tipos de recursos compatíveis.

Para o Azure Blueprints, use:

Para o Azure Policy, use:

Para controle de acesso, use:

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

Para gerenciar recursos, use:

Os grupos de gerenciamento são recursos em nível de locatário. No entanto, é possível criá-los em uma implantação de grupo de gerenciamento definindo o escopo do novo grupo de gerenciamento para o locatário. Confira Grupo de gerenciamento.

Escopo de conjunto

Para definir o escopo para o grupo de gerenciamento, use:

targetScope = 'managementGroup'

Comandos de implantação

Para implantar em um grupo de gerenciamento, use os comandos de implantação de grupo de gerenciamento.

Para a CLI do Azure, use az deployment mg create:

az deployment mg create \
  --name demoMGDeployment \
  --location WestUS \
  --management-group-id myMG \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/management-level-deployment/azuredeploy.json"

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 em nível de grupo de gerenciamento, você deve informar 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 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 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 modelo 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 grupo de gerenciamento com o nome deployment1 em centralus, não poderá criar outra implantação mais tarde com o nome deployment1 no local 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 grupo de gerenciamento, você pode implantar recursos:

  • no grupo de gerenciamento de destino com base na operação
  • em outro grupo de gerenciamento do locatário
  • nas assinaturas do grupo de gerenciamento
  • nos grupos de recursos do grupo de gerenciamento
  • no locatário do grupo 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.

Escopo do grupo de gerenciamento

Para implantar recursos no grupo de gerenciamento de destino, adicione esses recursos com a palavra-chave resource.

targetScope = 'managementGroup'

// policy definition created in the management group
resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  ...
}

Para ter outro grupo de gerenciamento como destino, adicione um módulo. Use a função managementGroup para definir a propriedade scope. Forneça o nome do grupo de gerenciamento.

targetScope = 'managementGroup'

param otherManagementGroupName string

// module deployed at management group level but in a different management group
module exampleModule 'module.bicep' = {
  name: 'deployToDifferentMG'
  scope: managementGroup(otherManagementGroupName)
}

Escopo de assinatura

Também é possível visar a assinaturas de um grupo de gerenciamento. O usuário que implanta o modelo deve ter acesso ao escopo especificado.

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

targetScope = 'managementGroup'

param subscriptionID string

// module deployed to subscription in the management group
module exampleModule 'module.bicep' = {
  name: 'deployToSub'
  scope: subscription(subscriptionID)
}

Escopo de grupo de recursos

Você também pode visar a grupos de recursos do grupo de gerenciamento. O usuário que implanta o modelo deve ter acesso ao escopo especificado.

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

targetScope = 'managementGroup'

param subscriptionID string
param resourceGroupName string

// module deployed to resource group in the management group
module exampleModule 'module.bicep' = {
  name: 'deployToRG'
  scope: resourceGroup(subscriptionID, resourceGroupName)
}

Escopo de locatário

Para criar recursos no locatário, adicione um módulo. Use a função locatário para definir sua propriedade scope. O usuário que está implantando o modelo deve ter o acesso necessário para implantar no locatário.

targetScope = 'managementGroup'

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

Ou é possível definir o escopo como / para alguns tipos de recursos, como grupos de gerenciamento. A próxima seção descreve a criação de um novo grupo de gerenciamento.

Grupo de gerenciamento

Para criar um grupo de gerenciamento em uma implantação do grupo de gerenciamento, você deverá definir o escopo para o locatário.

O exemplo a seguir cria um novo grupo de gerenciamento no grupo de gerenciamento raiz.

targetScope = 'managementGroup'

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

resource newMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {}
}

output newManagementGroup string = mgName

O próximo exemplo cria um novo grupo de gerenciamento no grupo de gerenciamento direcionado para a implantação. Ele usa a função de grupo de gerenciamento.

targetScope = 'managementGroup'

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

resource newMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {
    details: {
      parent: {
        id: managementGroup().id
      }
    }
  }
}

output newManagementGroup string = mgName

Assinaturas

Para usar um modelo do ARM para criar uma assinatura do Azure em um grupo de gerenciamento, confira:

Para implantar um modelo que move uma assinatura existente do Azure para um novo grupo de gerenciamento, confira Mover assinaturas no modelo do ARM

Azure Policy

As definições de políticas personalizadas que são implantadas no grupo de gerenciamento são extensões do grupo de gerenciamento. Para obter a ID de uma definição de política personalizada, use a função extensionResourceId(). As definições de políticas internas são recursos em nível de locatário. Para obter a ID de uma definição de política interna, use a função tenantResourceId().

O exemplo a seguir mostra como definir uma política em nível de grupo de gerenciamento e atribuí-la.

targetScope = 'managementGroup'

@description('An array of the allowed locations, all other locations will be denied by the created policy.')
param allowedLocations array = [
  'australiaeast'
  'australiasoutheast'
  'australiacentral'
]

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  name: 'locationRestriction'
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        not: {
          field: 'location'
          in: allowedLocations
        }
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: 'locationAssignment'
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

Próximas etapas

Para saber mais sobre outros escopos, consulte: