Implantar recursos em vários escopos

Concluído

Às vezes, você precisa implantar recursos em vários níveis da sua hierarquia em uma só implantação. Estas são algumas situações em que recomendamos fazer isso:

  • Você precisa implantar recursos em dois grupos de recursos diferentes. Por exemplo, talvez você queira criar um grupo de segurança de rede em um grupo de recursos compartilhado e implantar um adaptador de rede para uma máquina virtual em um grupo de recursos para seu aplicativo.
  • Você está usando um modelo para criar um grupo de recursos, que é um recurso com escopo de assinatura, e deseja implantar uma conta de armazenamento e outros recursos do Azure nesse grupo de recursos usando uma implantação com escopo de grupo de recursos.
  • Você está implantando uma hierarquia de grupos de gerenciamento e deseja implantar algumas assinaturas, que são recursos com escopo de locatário.

Com o Bicep, você pode criar uma implantação que funciona em uma variedade de escopos usando a palavra-chave scope.

Observação

Os comandos nesta unidade são mostrados para ilustrar conceitos. Não execute os comandos ainda. Você praticará o que aprendeu aqui em breve.

Especificar o escopo de um módulo

Você pode usar módulos Bicep para implantar um conjunto de recursos em um escopo diferente do targetScope especificado no arquivo. Veja um exemplo de arquivo Bicep implantado com um targetScope de uma subscription, mas usa um módulo para implantar alguns recursos em um grupo de recursos:

targetScope = 'subscription'

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

Observe que a propriedade scope usa uma função Bicep para ajudar a identificar o escopo a ser direcionado. O exemplo anterior usa a função resourceGroup() e especifica o nome do grupo de recursos a ser direcionado. Você também pode usar as funções subscription(), managementGroup() e tenant(). Usando a palavra-chave targetScope em arquivos Bicep e a palavra-chave scope em módulos, é possível criar muitas combinações diferentes de escopos para suas implantações.

Observação

Uma exceção disso é que os arquivos Bicep com um targetScope de resourceGroup ou subscription não podem incluir um módulo com um scope de managementGroup.

Dica

Se você usar um arquivo Bicep com escopo de assinatura para criar um grupo de recursos, use o nome simbólico do grupo de recursos como o scope de um módulo. Você verá como fazer isso no próximo exercício.

Implantar recursos em vários grupos de recursos

Um uso comum de escopos é implantar recursos em vários grupos de recursos. Embora não seja possível definir a propriedade scope na maioria dos recursos do Azure, você pode usar módulos para informar o Bicep de que um conjunto de recursos deve ser implantado em um grupo de recursos diferente.

Por exemplo, o ideal é criar um só conjunto de arquivos Bicep que implanta uma rede virtual e os recursos associados em um grupo de recursos compartilhado chamado ToyNetworking e implantar um adaptador de rede em um grupo de recursos diferente. Esta é a aparência do arquivo Bicep:

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

resource networkInterface 'Microsoft.Network/networkInterfaces@2024-01-01' = {
  name: 'production-nic'
  location: resourceGroup().location
  properties: {
    ipConfigurations: [
      {
        name: 'toy-subnet-ip-configuration'
        properties: {
          subnet: {
            id: networkModule.outputs.subnetResourceId
          }
        }
      }
    ]
  }
}

Observe que os recursos a serem implantados no grupo de recursos ToyNetworking são definidos em um módulo, e a saída subnetResourceId é usada na definição de recurso do adaptador de rede.

Depois de implantar esse arquivo, você pode ter como destino outro grupo de recursos chamado ProjectTeddybear, desta forma:

az deployment group create --resource-group ProjectTeddybear ...
New-AzResourceGroupDeployment -ResourceGroupName ProjectTeddybear ...

Embora a implantação tenha como alvo o grupo de recursos ProjectTeddybear, os recursos de rede virtual são implementados no grupo de recursos ToyNetworking. A interface de rede é implantada no grupo de recursos ProjectTeddybear.

Você pode, até mesmo, implantar um grupo de recursos em outra assinatura incluindo a ID da assinatura no escopo resourceGroup:

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'ToyNetworking')
  name: 'networkModule'
}

Da mesma forma, você pode usar a função de escopo subscription() para implantar recursos em várias assinaturas no escopo de assinatura e usar a função de escopo managementGroup() para implantar os recursos em vários grupos de gerenciamento. No entanto, não é possível implantá-los em vários locatários.

Especificar o escopo para um recurso individual

Você pode usar a palavra-chave scope em alguns outros tipos de recursos específicos, não apenas em módulos. Os recursos de extensão usam a palavra-chave scope para especificar a qual recurso eles se aplicam. Além disso, os recursos com escopo de locatário podem usar a palavra-chave scope para que você possa implantá-los por meio de qualquer modelo.

Por exemplo, você pode usar um arquivo Bicep para criar uma hierarquia de grupos de gerenciamento, conforme mostrado no seguinte exemplo:

targetScope = 'managementGroup'

resource parentManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

Observe que este exemplo usa targetScope = 'managementGroup' no arquivo de modelo, mas, em seguida, implanta os grupos de gerenciamento dentro do escopo tenant().

Observação

O exemplo anterior ilustra como você pode usar o Bicep para criar uma hierarquia de grupos de gerenciamento. O grupo de gerenciamento NonProduction será um filho do grupo de gerenciamento raiz, e o grupo de gerenciamento SecretRND será um filho do grupo de gerenciamento NonProduction.

Criar um grupo de gerenciamento e uma hierarquia de assinaturas

Agora você já sabe como implantar muitos recursos diferentes em uma variedade de escopos e como usar módulos Bicep e a palavra-chave scope para implantar combinações de recursos. Vamos aplicar todo esse novo conhecimento à extensão da hierarquia de grupos de gerenciamento no exemplo anterior. Agora, a hierarquia também incluirá um alias de assinatura, que é um recurso com escopo de locatário que cria uma assinatura do Azure:

resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

Observação

Ao criar um alias de assinatura, você também especifica algumas outras propriedades, como um escopo do orçamento. Nós os omitimos para maior clareza.

Em seguida, você poderá associar a assinatura a um grupo de gerenciamento, o que exige a implantação de um tipo de recurso chamado Microsoft.Management/managementGroups/subscriptions. Devido ao modo de funcionamento desse recurso, ele será declarado em um módulo. Por exemplo, veja abaixo um arquivo chamado modules/mg-subscription-association.bicep:

targetScope = 'tenant'

@description('The name of the management group that should contain the subscription.')
param managementGroupName string

@description('The subscription ID to place into the management group.')
param subscriptionId string

resource managementGroup 'Microsoft.Management/managementGroups@2023-04-01' existing = {
  name: managementGroupName
}

resource subscriptionAssociation 'Microsoft.Management/managementGroups/subscriptions@2023-04-01' = {
  parent: managementGroup
  name: subscriptionId
}

Observe que o grupo de gerenciamento é referenciado por meio da palavra-chave existing.

Em seguida, o arquivo Bicep principal poderá criar a associação incluindo o módulo. Este é o arquivo Bicep inteiro:

targetScope = 'managementGroup'

@description('The name of the subscription alias to deploy.')
param subscriptionAliasName string

resource parentManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

module subscriptionAssociation 'modules/mg-subscription-association.bicep' = {
  name: 'subscriptionAssociation'
  scope: tenant()
  params: {
    managementGroupName: childManagementGroup.name
    subscriptionId: subscription.properties.subscriptionId
  }
}

Como você viu, é possível usar todos os escopos e recursos da linguagem Bicep juntos para criar implantações sofisticadas de toda a sua infraestrutura do Azure.