Exercício – usar loops de saída e de variável

Concluído

Para sua empresa de brinquedos, você precisa implantar redes virtuais em cada país/região em que está lançando o urso. Seus desenvolvedores também pediram que você desse a eles os FQDNs (nomes de domínio totalmente qualificados) de cada um dos servidores lógicos regionais do SQL do Azure que você implantou.

Neste exercício, você vai adicionar a rede virtual e a respectiva configuração ao seu código Bicep e gerar os FQDNs do servidor lógico.

Durante o processo, você vai:

  • Atualizar o código Bicep para especificar um parâmetro para as sub-redes de cada rede virtual.
  • Adicionar um loop de variável para criar uma matriz de sub-rede, que você usará na declaração de recurso de rede virtual.
  • Adicionar um loop de saída para criar a lista de FQDNs de servidor lógico.
  • Implantar o arquivo Bicep e verificar a implantação dos recursos.

Adicionar a rede virtual ao arquivo Bicep

  1. Abra o arquivo main.bicep.

  2. Sob as declarações de parâmetro, adicione os seguintes parâmetros:

    @description('The IP address range for all virtual networks to use.')
    param virtualNetworkAddressPrefix string = '10.10.0.0/16'
    
    @description('The name and IP address range for each subnet in the virtual networks.')
    param subnets array = [
      {
        name: 'frontend'
        ipAddressRange: '10.10.5.0/24'
      }
      {
        name: 'backend'
        ipAddressRange: '10.10.10.0/24'
      }
    ]
    
  3. Abaixo dos parâmetros, adicione uma linha em branco e, em seguida, adicione o loop de variável subnetProperties:

    var subnetProperties = [for subnet in subnets: {
      name: subnet.name
      properties: {
        addressPrefix: subnet.ipAddressRange
      }
    }]
    
  4. Na parte inferior do arquivo, abaixo do loop de módulo databases, adicione o seguinte loop de recurso:

    resource virtualNetworks 'Microsoft.Network/virtualNetworks@2024-01-01' = [for location in locations: {
      name: 'teddybear-${location}'
      location: location
      properties:{
        addressSpace:{
          addressPrefixes:[
            virtualNetworkAddressPrefix
          ]
        }
        subnets: subnetProperties
      }
    }]
    

    Observação

    Este exemplo usa o mesmo espaço de endereço para todas as redes virtuais. Normalmente, ao criar várias redes virtuais, você forneceria a elas espaços de endereço diferentes para o caso de eventualmente precisar conectá-las entre si.

  5. Salve as alterações no arquivo.

Adicionar saídas ao módulo de banco de dados

  1. Abra o arquivo modules/database.bicep.

  2. Na parte inferior do arquivo, adicione as seguintes saídas:

    output serverName string = sqlServer.name
    output location string = location
    output serverFullyQualifiedDomainName string = sqlServer.properties.fullyQualifiedDomainName
    
  3. Salve as alterações no arquivo.

Passar as saídas pelo arquivo Bicep pai

  1. Abra o arquivo main.bicep.

  2. Na parte inferior do arquivo, adicione o seguinte loop de saída:

    output serverInfo array = [for i in range(0, length(locations)): {
      name: databases[i].outputs.serverName
      location: databases[i].outputs.location
      fullyQualifiedDomainName: databases[i].outputs.serverFullyQualifiedDomainName
    }]
    
  3. Salve as alterações no arquivo.

Verificar o arquivo Bicep

Depois de concluir todas as alterações anteriores, o arquivo main.bicep deverá ser semelhante a este exemplo:

@description('The Azure regions into which the resources should be deployed.')
param locations array = [
  'westeurope'
  'eastus2'
  'eastasia'
]

@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string

@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorLoginPassword string

@description('The IP address range for all virtual networks to use.')
param virtualNetworkAddressPrefix string = '10.10.0.0/16'

@description('The name and IP address range for each subnet in the virtual networks.')
param subnets array = [
  {
    name: 'frontend'
    ipAddressRange: '10.10.5.0/24'
  }
  {
    name: 'backend'
    ipAddressRange: '10.10.10.0/24'
  }
]

var subnetProperties = [for subnet in subnets: {
  name: subnet.name
  properties: {
    addressPrefix: subnet.ipAddressRange
  }
}]

module databases 'modules/database.bicep' = [for location in locations: {
  name: 'database-${location}'
  params: {
    location: location
    sqlServerAdministratorLogin: sqlServerAdministratorLogin
    sqlServerAdministratorLoginPassword: sqlServerAdministratorLoginPassword
  }
}]

resource virtualNetworks 'Microsoft.Network/virtualNetworks@2024-01-01' = [for location in locations: {
  name: 'teddybear-${location}'
  location: location
  properties:{
    addressSpace:{
      addressPrefixes:[
        virtualNetworkAddressPrefix
      ]
    }
    subnets: subnetProperties
  }
}]

output serverInfo array = [for i in range(0, length(locations)): {
  name: databases[i].outputs.serverName
  location: databases[i].outputs.location
  fullyQualifiedDomainName: databases[i].outputs.serverFullyQualifiedDomainName
}]

O arquivo database.bicep deve ser parecido com este exemplo:

@description('The Azure region into which the resources should be deployed.')
param location string

@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string

@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorLoginPassword string

@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object = {
  name: 'Standard'
  tier: 'Standard'
}

@description('The name of the environment. This must be Development or Production.')
@allowed([
  'Development'
  'Production'
])
param environmentName string = 'Development'

@description('The name of the audit storage account SKU.')
param auditStorageAccountSkuName string = 'Standard_LRS'

var sqlServerName = 'teddy${location}${uniqueString(resourceGroup().id)}'
var sqlDatabaseName = 'TeddyBear'
var auditingEnabled = environmentName == 'Production'
var auditStorageAccountName = take('bearaudit${location}${uniqueString(resourceGroup().id)}', 24)

resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: sqlServerAdministratorLogin
    administratorLoginPassword: sqlServerAdministratorLoginPassword
  }
}

resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-08-01-preview' = {
  parent: sqlServer
  name: sqlDatabaseName
  location: location
  sku: sqlDatabaseSku
}

resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (auditingEnabled) {
  name: auditStorageAccountName
  location: location
  sku: {
    name: auditStorageAccountSkuName
  }
  kind: 'StorageV2'  
}

resource sqlServerAudit 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (auditingEnabled) {
  parent: sqlServer
  name: 'default'
  properties: {
    state: 'Enabled'
    storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
    storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
  }
}

output serverName string = sqlServer.name
output location string = location
output serverFullyQualifiedDomainName string = sqlServer.properties.fullyQualifiedDomainName

Caso contrário, copie o exemplo ou ajuste o modelo para que ele corresponda ao exemplo.

Implantar o modelo Bicep no Azure

No terminal do Visual Studio Code, execute o código a seguir para implantar o modelo Bicep no Azure. Esse processo pode levar alguns minutos para ser concluído e, em seguida, você terá uma implantação bem-sucedida.

az deployment group create --template-file main.bicep

No terminal do Visual Studio Code, execute o comando do Azure PowerShell a seguir para implantar o modelo Bicep no Azure. Esse processo pode levar alguns minutos para ser concluído e, em seguida, você terá uma implantação bem-sucedida.

New-AzResourceGroupDeployment -TemplateFile main.bicep

Cuidado

Verifique se você está usando o mesmo logon e senha usados anteriormente, caso contrário, a implantação não será bem-sucedida.

Aguarde até que a implantação seja concluída.

Verificar a implantação

Após a conclusão da implantação, convém verificar se as novas redes virtuais estão implantadas e se elas têm sub-redes configuradas conforme o esperado.

  1. Vá para o portal do Azure e verifique se você está na assinatura da área restrita.

  2. Selecione [nome do grupo de recursos de área restrita].

  3. Verifique se as redes virtuais foram implantadas nos três locais do Azure.

    Captura de tela do portal do Azure, mostrando uma lista de redes virtuais após a implantação.

  4. Selecione a rede virtual denominada teddybear-eastasia.

  5. Na barra de pesquisa, insira Sub-redes. Em Configurações, selecione Sub-redes.

    Captura de tela da interface portal do Azure para a rede virtual, mostrando o campo de pesquisa com o texto Sub-redes inserido.

  6. Verifique se as sub-redes implantadas têm os nomes e os endereços IP que foram especificados no valor padrão do parâmetro subnets.

    Captura de tela do portal do Azure que mostra duas sub-redes de rede virtual após a implantação.

  7. Verifique a saída do comando de implantação. Ele deve incluir o nome e o FQDN dos três servidores lógicos que foram implantados, como mostrado aqui:

    Captura de tela da saída da implantação, exibindo as propriedades dos servidores lógicos.

  1. Vá para o portal do Azure e verifique se você está na assinatura da área restrita.

  2. Selecione [nome do grupo de recursos de área restrita].

  3. Verifique se as redes virtuais foram implantadas nos três locais do Azure.

    Captura de tela do portal do Azure, mostrando uma lista de redes virtuais após a implantação.

  4. Selecione a rede virtual denominada teddybear-eastasia.

  5. Na barra de pesquisa, insira Sub-redes. Em Configurações, selecione Sub-redes.

    Captura de tela da interface portal do Azure para a rede virtual, mostrando o campo de pesquisa com o texto Sub-redes inserido.

  6. Verifique se as sub-redes implantadas têm os nomes e os endereços IP que foram especificados no valor padrão do parâmetro subnets.

    Captura de tela do portal do Azure que mostra duas sub-redes de rede virtual após a implantação.

  7. Verifique a saída do comando de implantação. Ele deve incluir o nome e o FQDN dos três servidores lógicos que foram implantados, como mostrado aqui:

    Captura de tela da saída da implantação, exibindo as propriedades dos servidores lógicos.