Implantar recursos em vários escopos
Às vezes, você precisa implantar recursos em vários níveis de sua hierarquia de dentro de uma implantação. Aqui estão algumas situações em que você pode querer 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 compartilhados e também implantar uma interface 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 grupo de gerenciamento e também deseja implantar algumas assinaturas, que são recursos com escopo de locatário.
Com o Bicep, você pode criar uma implantação que funcione em uma variedade de escopos usando a palavra-chave scope
.
Nota
Os comandos nesta unidade são mostrados para ilustrar conceitos. Não execute os comandos ainda. Você vai praticar o que você aprende aqui em breve.
Especificar o âmbito 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. Aqui está um exemplo de arquivo Bicep que é implantado com um targetScope
de , 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 scope
propriedade usa uma função Bicep para ajudar a identificar o escopo a ser direcionado. O exemplo anterior usa a resourceGroup()
função e especifica o nome do grupo de recursos a ser direcionado. Você também pode usar as subscription()
funções , managementGroup()
e tenant()
. Usando a targetScope
palavra-chave em arquivos Bicep e a scope
palavra-chave em módulos, é possível criar muitas combinações diferentes de escopos para suas implantações.
Nota
Uma exceção é que os arquivos Bicep com um targetScope
de resourceGroup
ou subscription
não podem incluir um módulo com um scope
de managementGroup
.
Gorjeta
Se você usar um arquivo Bicep com escopo de assinatura para criar um grupo de recursos, poderá usar 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 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 scope
propriedade na maioria dos recursos do Azure, você pode usar módulos para informar ao Bicep que um conjunto de recursos deve ser implantado em um grupo de recursos diferente.
Por exemplo, talvez você queira criar um único conjunto de arquivos Bicep que implante uma rede virtual e seus recursos associados a um grupo de recursos compartilhados chamado ToyNetwork e, em seguida, implantar uma interface de rede em um grupo de recursos diferente. Veja 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 subnetResourceId
saída é usada na definição de recursos da interface de rede.
Depois de implantar esse arquivo, você pode direcionar outro grupo de recursos chamado ProjectTeddybear, da seguinte 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 implantados 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 resourceGroup
escopo:
module networkModule 'modules/network.bicep' = {
scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'ToyNetworking')
name: 'networkModule'
}
Da mesma forma, você pode usar a subscription()
função de escopo para implantar recursos em várias assinaturas no escopo da assinatura e pode usar a função de managementGroup()
escopo 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 de um único recurso
Você pode usar a scope
palavra-chave em alguns outros tipos de recursos específicos, não apenas módulos. Os recursos de extensão usam a scope
palavra-chave para especificar a qual recurso se aplicam. Além disso, os recursos com escopo de locatário podem usar a scope
palavra-chave para que você possa implantá-los a partir de qualquer modelo.
Por exemplo, você pode usar um arquivo Bicep para criar uma hierarquia de grupo de gerenciamento, conforme mostrado no exemplo a seguir:
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 implanta os grupos de gerenciamento dentro do tenant()
escopo.
Nota
O exemplo anterior ilustra como você pode usar o Bicep para criar uma hierarquia de grupo de gerenciamento. O grupo de gerenciamento de Não Produção será filho do grupo de gerenciamento raiz e o grupo de gerenciamento SecretRND será filho do grupo de gerenciamento de Não Produção .
Criar um grupo de gerenciamento e hierarquia de assinatura
Agora você sabe como implantar muitos recursos diferentes em uma variedade de escopos e sabe como usar módulos Bicep e a scope
palavra-chave para implantar combinações de recursos. Vamos aplicar todo esse novo conhecimento para estender a hierarquia do grupo de gerenciamento no exemplo anterior. Agora, a hierarquia também incluirá um alias de assinatura, que é um recurso de escopo de locatário que cria uma nova assinatura do Azure:
resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
scope: tenant()
name: subscriptionAliasName
properties: {
// ...
}
}
Nota
Ao criar um alias de assinatura, você também especifica algumas outras propriedades, como um escopo de cobrança. Nós os omitimos por uma questão de clareza.
Em seguida, você pode associar a assinatura a um grupo de gerenciamento, o que requer a implantação de um tipo de recurso chamado Microsoft.Management/managementGroups/subscriptions
. Devido à forma como esse recurso funciona, você o declararia em um módulo. Por exemplo, aqui está 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 existing
palavra-chave.
O arquivo Bicep principal pode então criar a associação incluindo o módulo. Aqui está todo o arquivo Bicep:
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, você pode usar todos os escopos e recursos de linguagem Bicep juntos para criar implantações sofisticadas de toda a sua infraestrutura do Azure.