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 controle de acesso baseado em função Azure (Azure RBAC) para sua assinatura, que as aplica em sua assinatura.

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

Observação

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

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 assinatura. Esta seção lista os tipos de recursos compatíveis.

Para o Azure Blueprints, use:

Para políticas do Azure, use:

Para controle de acesso, use:

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

Para criar novo grupo de recursos, use:

Para gerenciar sua assinatura, use:

Para monitoramento, use:

Para segurança, use:

Outros tipos compatíveis incluem:

Escopo de conjunto

Para definir o escopo da assinatura, use:

targetScope = 'subscription'

Comandos de implantação

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

Para 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 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 da assinatura, 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. O Grupo de gerenciamento e implantação de 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.json 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 assinatura 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 fazer uma implantação em uma assinatura, você pode implantar recursos:

  • na assinatura de destino da operação
  • em qualquer assinatura no locatário
  • em grupos de recursos dentro da assinatura ou outras assinaturas
  • no locatário para a assinatura

É 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 de assinatura

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

targetScope = 'subscription'

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

Para obter exemplos de implantação na assinatura, confira Criar grupos de recursos com o Bicep 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 propriedade scope. Forneça a propriedade subscriptionId 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)
}

Escopo de grupo de recursos

Para implantar recursos em um grupo de recursos dentro da assinatura, adicione um módulo e defina a propriedade scope. Se o grupo de recursos já existe, use a função resourceGroup para configurar 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 configurar o escopo para o nome simbólico, confira Criar grupo de recursos com o Bicep.

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.

O exemplo a seguir inclui um módulo que é implantado no 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 como tenant() para 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@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {}
}

output output string = mgName

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

Grupos de recursos

Para obter informações sobre como criar grupos de recursos, confira 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 para a assinatura. Se a definição de política usa parâmetros, você deve fornecê-los como um objeto. Se a definição de política não aceita parâmetros, use o objeto vazio padrão.

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

Você pode definir e atribuir uma definição de política no mesmo arquivo 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
  }
}

Controle de acesso

Para aprender sobre atribuição de funções, confira 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@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 seguinte exemplo mostra o módulo no qual 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 ao qual 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óximas etapas

Para saber mais sobre outros escopos, consulte: