Exercício – Implantar recursos em vários escopos usando módulos

Concluído

Observação

Este módulo exige uma assinatura do Azure. Caso ainda não tenha uma, obtenha uma assinatura gratuita.

A equipe de P e D pediu sua ajuda para criar uma rede virtual na assinatura do Projeto Teddybear. Você sabe que ajudará a equipe com mais assinaturas no futuro. Portanto, decide estender seu modelo de Bicep reutilizável a fim de implantar uma rede virtual para uso dos membros da equipe.

Neste exercício, você atualizará o modelo que começou a criar no último exercício.

Durante o processo, você vai:

  • Atualizar o modelo com escopo de assinatura para criar um grupo de recursos.
  • Criar um módulo Bicep separado com uma rede virtual e usar parâmetros para controlar como a rede virtual é configurada.
  • Atualizar o modelo para implantar o módulo no grupo de recursos.
  • Implante o modelo.

Para este exercício, você precisa ter permissão para implantar recursos no escopo da assinatura. Se você não puder atender a esse requisito com sua conta atual do Azure, obtenha uma avaliação gratuita e crie uma assinatura e um locatário do Azure. Como alternativa, você pode ignorar as etapas de implantação neste exercício.

Criar um grupo de recursos

  1. No Visual Studio Code, abra o arquivo main.bicep criado no exercício anterior.

  2. Nas definições de variável atuais, adicione a seguinte definição de variável:

    var resourceGroupName = 'ToyNetworking'
    
  3. Na parte inferior do arquivo, adicione a seguinte definição de recurso:

    resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = {
      name: resourceGroupName
      location: deployment().location
    }
    

    Observe que você está definindo o grupo de recursos da mesma forma que definiria outro recurso. Um grupo de recursos é um recurso com escopo de assinatura que pode ser implantado e gerenciado em arquivos Bicep com o targetScope definido como subscription.

  4. Salve as alterações no arquivo.

Adicionar um módulo para criar uma rede virtual

Em seguida, você criará um módulo Bicep para a rede virtual da equipe de P e D. Você implantará os recursos no módulo para o grupo de recursos mais adiante neste exercício.

  1. No Visual Studio Code, crie uma pasta chamada módulos na mesma pasta em que você criou o arquivo main.bicep.

  2. Na pasta modules, crie e salve um arquivo chamado virtualNetwork.bicep.

  3. No arquivo virtualNetwork.bicep, adicione o seguinte conteúdo:

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    
    resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
      name: virtualNetworkName
      location: resourceGroup().location
      properties: {
        addressSpace: {
          addressPrefixes: [
            virtualNetworkAddressPrefix
          ]
        }
      }
    }
    

    Observe que você não especificou um targetScope para este módulo. Não é preciso especificar um escopo de destino quando o arquivo Bicep é direcionado a um grupo de recursos.

  4. Salve as alterações no arquivo.

Usar o módulo na implantação da assinatura

Agora você está pronto para instruir o Bicep a implantar o módulo no grupo de recursos.

  1. No arquivo main.bicep no Visual Studio Code, na linha targetScope, adicione as seguintes definições de parâmetro:

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    

    Esses parâmetros tornam o modelo reutilizável. Sempre que a equipe de P e D precisar de uma nova assinatura, você poderá criar uma rede virtual com um nome exclusivo e um intervalo de endereços IP.

  2. Na parte inferior do arquivo, adicione a seguinte definição de módulo:

    module virtualNetwork 'modules/virtualNetwork.bicep' = {
      scope: resourceGroup
      name: 'virtualNetwork'
      params: {
        virtualNetworkName: virtualNetworkName
        virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
      }
    }
    

    Observe que você está especificando explicitamente o scope para o módulo. O Bicep reconhece que os recursos dentro do módulo devem ser implantados no grupo de recursos criado anteriormente no arquivo.

Verificar o modelo

O arquivo main.bicep deverá ser semelhante ao seguinte:

targetScope = 'subscription'

param virtualNetworkName string
param virtualNetworkAddressPrefix string

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'
var resourceGroupName = 'ToyNetworking'

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-01' = {
  name: policyDefinitionName
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        allOf: [
          {
            field: 'type'
            equals: 'Microsoft.Compute/virtualMachines'
          }
          {
            anyOf: [
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_F*'
              }
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_G*'
              }
            ]
          }
        ]
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
  name: policyAssignmentName
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = {
  name: resourceGroupName
  location: deployment().location
}

module virtualNetwork 'modules/virtualNetwork.bicep' = {
  scope: resourceGroup
  name: 'virtualNetwork'
  params: {
    virtualNetworkName: virtualNetworkName
    virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
  }
}

O arquivo modules/virtualNetwork.bicep deverá ser semelhante ao seguinte:

param virtualNetworkName string
param virtualNetworkAddressPrefix string

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
  name: virtualNetworkName
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        virtualNetworkAddressPrefix
      ]
    }
  }
}

Se um desses arquivos não corresponder ao exemplo, copie o exemplo ou ajuste o modelo.

Implantar o modelo no Azure

No terminal do Visual Studio Code, implante o modelo usando os seguintes comandos da CLI do Azure:

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="sub-scope-"$today
virtualNetworkName="rnd-vnet-001"
virtualNetworkAddressPrefix="10.0.0.0/24"

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile \
    --parameters virtualNetworkName=$virtualNetworkName \
                 virtualNetworkAddressPrefix=$virtualNetworkAddressPrefix

No terminal do Visual Studio Code, implante o modelo usando os seguintes comandos do Azure PowerShell:

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "sub-scope-$today"
$virtualNetworkName = 'rnd-vnet-001'
$virtualNetworkAddressPrefix = '10.0.0.0/24'

New-AzSubscriptionDeployment `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile `
  -virtualNetworkName $virtualNetworkName `
  -virtualNetworkAddressPrefix $virtualNetworkAddressPrefix

Observe que você está transmitindo valores para os parâmetros virtualNetworkName e virtualNetworkAddressPrefix. Quando outra equipe de P e D pedir para você preparar uma assinatura para ela, você poderá alterar esses valores para fornecer a essa equipe uma rede virtual própria.

A implantação pode levar alguns minutos para ser concluída, e você verá uma implantação bem-sucedida.

Verificar a implantação

Agora, você verificará o grupo de recursos e a implantação criados pelo módulo.

  1. Acesse o portal do Azure.

  2. No painel esquerdo, selecione Grupos de recursos. Observe que o grupo de recursos ToyNetworking foi criado.

  3. Escolha o grupo de recursos ToyNetworking. Observe que o módulo foi implantado no grupo de recursos com êxito e que a rede virtual foi criada:

    Screenshot of the Azure portal, showing the ToyNetworking resource group.

Limpar os recursos

Você implantou com êxito os recursos com escopo de assinatura, incluindo um grupo de recursos, e usou um módulo para implantar o recurso no grupo de recursos criado. Você pode remover os recursos de política e o grupo de recursos criados.

Cuidado

Esse comando excluirá permanentemente o grupo de recursos chamado ToyNetworking e todos os respectivos recursos. Se você implantou qualquer outra coisa nesse grupo de recursos, ignore esta etapa.

subscriptionId=$(az account show --query 'id' --output tsv)

az policy assignment delete --name 'DenyFandGSeriesVMs' --scope "/subscriptions/$subscriptionId"
az policy definition delete --name 'DenyFandGSeriesVMs' --subscription $subscriptionId
az group delete --name ToyNetworking
$subscriptionId = (Get-AzContext).Subscription.Id

Remove-AzPolicyAssignment -Name 'DenyFandGSeriesVMs' -Scope "/subscriptions/$subscriptionId"
Remove-AzPolicyDefinition -Name 'DenyFandGSeriesVMs' -SubscriptionId $subscriptionId
Remove-AzResourceGroup -Name ToyNetworking