Exercício – Converter e migrar recursos

Concluído

Importante

É preciso ter uma assinatura do Azure para fazer esse exercício, e isso pode gerar encargos. Caso ainda não tenha uma assinatura do Azure, crie uma conta gratuita antes de começar.

Sua empresa de brinquedos adquiriu um concorrente que criou um caminhão de brinquedo popular. Os brinquedos se conectam a uma máquina virtual hospedada no Azure para receber atualizações de firmware. Todos os recursos da máquina virtual foram criados manualmente por meio do portal do Azure. Nesta unidade, você iniciará o processo de migração dos recursos para um arquivo Bicep.

Durante o processo, você executará as seguintes tarefas:

  • Implantar uma máquina virtual usando o portal do Azure.
  • Exportar os recursos de máquina virtual para um modelo JSON.
  • Descompilar o modelo JSON em Bicep.
  • Crie um arquivo Bicep e mova os recursos do modelo descompilado.

Este exercício usa a extensão Bicep para Visual Studio Code. É necessário que você instale essa extensão no Visual Studio Code.

Criar uma máquina virtual usando o portal do Azure

Para simular a situação no cenário de exemplo, primeiro, você implantará uma máquina virtual usando o portal do Azure.

  1. Entre no portal do Azure.

  2. Na página inicial do Azure, em Serviços do Azure, selecione Criar um recurso:

    Captura de tela que mostra o portal do Azure. A opção Criar um recurso está realçada.

    O Azure Marketplace aparece no painel Criar um recurso.

  3. Em Ubuntu Server 20.04 LTS, selecione Criar:

    Captura de tela que mostra o Azure Marketplace. O link Criar no Ubuntu Server 20.04 LTS está realçado.

    Importante

    Se o Ubuntu Server 20.04 LTS não aparecer, acesse o Ubuntu Server 20.04 LTS diretamente no Azure Marketplace.

  4. Na guia Básico, insira os valores a seguir para cada configuração. Use os padrões para todas as outras configurações.

    Configuração Valor
    Detalhes do projeto
    Grupo de recursos Escolha Criar e insira ToyTruck
    Detalhes da instância
    Nome da máquina virtual ToyTruckServer
    Região (EUA) Oeste dos EUA 3
    Opções de disponibilidade Nenhuma redundância de infraestrutura necessária
    Imagem Ubuntu Server 20.04 LTS - x64 Gen2
    Tamanho Standard_D2s_v3
    Conta de administrador
    Tipo de autenticação Senha
    Nome de Usuário toytruckadmin
    Senha Insira uma senha
    Regras de porta de entrada
    Porta de entrada públicas Nenhum
  5. Na guia Gerenciamento, verifique se a opção Habilitar desligamento automático não está selecionada.

  6. Selecione Examinar + criar. O Azure validará as configurações. Talvez seja necessário inserir ou selecionar mais informações dependendo dos requisitos da imagem.

  7. Escolha Criar para implantar e criar a VM.

    O portal do Azure mostra a implantação enquanto ela está em andamento.

  8. Quando a implantação for concluída, selecione o nome do grupo de recursos para abrir o grupo de recursos:

    Captura de tela do portal do Azure que mostra a implantação. O nome do grupo de recursos está realçado.

    Agora, o grupo de recursos contém a máquina virtual e as respectivas dependências:

    Captura de tela do portal do Azure que mostra o grupo de recursos.

Exportar o conteúdo do grupo de recursos para um modelo JSON

  1. No menu esquerdo, em Automação, selecione Exportar modelo:

    Captura de tela do portal do Azure que mostra o item de menu Exportar modelo no painel do grupo de recursos.

    Um modelo JSON será gerado. Podem ser necessários alguns minutos para que o processo seja concluído.

  2. Selecione o botão de download:

    Captura de tela do portal do Azure que mostra o modelo JSON do grupo de recursos exportado, com o botão Baixar realçado.

    O modelo JSON e o arquivo de parâmetros são baixados no computador como um arquivo zip.

  3. Descompacte o arquivo em uma pasta que você possa acessar com facilidade, como a área de trabalho.

  4. Abra o Visual Studio Code.

Preparar o ambiente local

  1. No menu Terminal, selecione Novo Terminal. A janela do terminal geralmente é aberta na metade inferior da tela.

  2. Se o shell mostrado no lado direito da janela do terminal for o bash, o shell correto será aberto e você poderá passar para a próxima seção.

    Captura de tela da janela do terminal do Visual Studio Code com a opção bash mostrada.

  3. Se um shell diferente de bash for exibido, selecione a seta suspensa do shell e selecione Azure Cloud Shell (Bash).

    Captura de tela da janela do terminal do Visual Studio Code, com o menu suspenso do shell do terminal mostrado e o Padrão Git Bash selecionado.

  4. Na lista de shells de terminal, selecione bash.

    Captura de tela da janela do terminal do Visual Studio Code com o terminal do bash selecionado.

  5. No terminal, vá até o diretório no qual você salvou o modelo. Por exemplo, se você salvou o modelo na pasta modelos, use este comando:

    cd templates
    

Instalar o Bicep

Veja se você tem a versão mais recente do Bicep executando o seguinte comando:

az bicep install && az bicep upgrade
  1. No menu Terminal, selecione Novo Terminal. A janela do terminal geralmente é aberta na metade inferior da tela.

  2. Se o shell mostrado no lado direito da janela do terminal for o powershell ou o pwsh, o shell correto será aberto e você poderá passar para a próxima seção.

    Captura de tela da janela do terminal do Visual Studio Code, com a opção pwsh exibida na lista suspensa do shell.

  3. Se aparecer um shell diferente do powershell ou pwsh, selecione a seta da lista de seleção do shell e escolha PowerShell.

    Captura de tela da janela do terminal do Visual Studio Code, com a lista suspensa do shell do terminal exibida e o PowerShell selecionado.

  4. Na lista de shells de terminal, selecione powershell ou pwsh.

    Captura de tela da janela do terminal do Visual Studio Code com o terminal do PowerShell selecionado.

  5. No terminal, vá até o diretório no qual você salvou o modelo. Por exemplo, se você salvou o modelo na pasta modelos, use este comando:

    Set-Location -Path templates
    

Instalar a CLI do Bicep

Para usar o Bicep no Azure PowerShell, instale a CLI do Bicep.

Descompilar o modelo JSON em Bicep

Use o comando decompile para criar um arquivo Bicep com base no modelo:

az bicep decompile --file template.json

A operação de descompilação gera um aviso semelhante a este:

WARNING: Decompilation is a best-effort process, as there is no guaranteed mapping from ARM JSON
 to Bicep.

You might need to fix warnings and errors in the generated bicep file(s), or decompilation might fail
 entirely if an accurate conversion is not possible.

If you would like to report any issues or inaccurate conversions,
please see https://github.com/Azure/bicep/issues.

Use o comando decompile para criar um arquivo Bicep com base no modelo:

bicep decompile template.json

A operação de descompilação gera um aviso semelhante a este:

WARNING: Decompilation is a best-effort process, as there is no guaranteed mapping from ARM JSON
 to Bicep.

You might need to fix warnings and errors in the generated bicep file(s), or decompilation might fail
 entirely if an accurate conversion is not possible.

If you would like to report any issues or inaccurate conversions,
please see https://github.com/Azure/bicep/issues.

Inspecionar o arquivo Bicep descompilado

Abra o arquivo template.bicep no Visual Studio Code e leia-o. Observe que se trata de um arquivo Bicep válido, mas com alguns problemas, incluindo:

  • Os nomes simbólicos fornecidos aos parâmetros e aos recursos incluem sublinhados e não são de fáceis de entender.
  • A propriedade location está embutida em código em todas as definições de recurso.
  • O modelo inclui valores embutidos em código que devem ser parâmetros ou ser definidos automaticamente pelo Azure.

Você corrigirá esses problemas no restante deste módulo.

Criar um arquivo Bicep

  1. No Visual Studio Code, crie um arquivo chamado main.bicep.

  2. Salve o arquivo vazio para que Visual Studio Code carregue as ferramentas Bicep.

    Você pode selecionar Arquivo>Salvar Como ou Ctrl+S no Windows (⌘+S no macOS).

  3. Divida o editor para que você possa ver os dois arquivos ao mesmo tempo (o arquivo template.bicep no painel esquerdo e o arquivo main.bicep no painel direito).

    1. Selecione a guia main.bicep.
    2. Selecione Exibir>Layout do Editor>Dividir à Direita para abrir a guia main.bicep no painel direito.
    3. Feche a guia main.bicep no painel esquerdo.

    Captura de tela do editor do Visual Studio Code dividido que mostra o arquivo ponto bicep de modelo no painel esquerdo e o arquivo ponto bicep principal no painel direito.

Copiar cada elemento no novo arquivo Bicep

  1. Copie o recurso nomeado networkSecurityGroups_ToyTruckServer_nsg_name_resource do arquivo template.bicep para o arquivo main.bicep.

    Ao copiá-lo, observe que a propriedade securityRules está vazia. Mais adiante neste módulo, você vai refatorar o arquivo para remover as propriedades redundantes.

  2. O Visual Studio Code indica um erro porque o parâmetro networkSecurityGroups_ToyTruckServer_nsg_name está ausente:

    Captura de tela do editor do Visual Studio Code que mostra o recurso migrado, com uma dica de ferramenta exibindo um erro devido ao parâmetro ausente.

    Copie o parâmetro para o arquivo main.bicep.

  3. Repita o processo com os seguintes recursos e os parâmetros associados:

    • publicIPAddresses_ToyTruckServer_ip_name_resource
    • virtualMachines_ToyTruckServer_name_resource
    • virtualNetworks_ToyTruck_vnet_name_resource
    • virtualNetworks_ToyTruck_vnet_name_default
    • networkInterfaces_toytruckserver890_name_resource

    Observação

    Os nomes dos recursos na implantação podem ser diferentes dos listados aqui. Encontre os recursos que têm nomes parecidos com esses nomes.

    Ao copiar cada recurso, inspecione as propriedades dele. Mais adiante neste módulo, você atualizará as propriedades e as configurações de cada recurso visando a conformidade com as melhores práticas do Bicep.

    Dica

    Ao converter ou exportar os seus modelos, você pode atualizar os recursos para seguir as práticas recomendadas ao copiá-los. Neste módulo, atualizaremos os recursos separadamente para facilitar a compreensão de cada fase do processo de migração.

Verifique se há recursos ausentes

  1. No portal do Azure, abra o grupo de recursos ToyTruck.

  2. Examine a lista de recursos e compare-a com a lista de recursos no arquivo Bicep. Observe que o grupo de recursos contém um recurso de Disco que não está definido como um resource no arquivo Bicep:

    Captura de tela do portal do Azure que mostra o grupo de recursos, com o recurso de disco realçado.

    Ao trabalhar com máquinas virtuais no Bicep, você não precisa definir explicitamente o recurso de disco gerenciado. Nesse caso, você define as propriedades da máquina virtual e o Azure cria o disco gerenciado automaticamente. Neste exemplo, você não precisa se preocupar que o recurso de disco não esteja definido no arquivo Bicep.

Verificar o modelo

No final da fase de migração, o arquivo main.bicep deve ser semelhante a este exemplo:

param virtualNetworks_ToyTruck_vnet_name string = 'ToyTruck-vnet'
param virtualMachines_ToyTruckServer_name string = 'ToyTruckServer'
param networkInterfaces_toytruckserver154_name string = 'toytruckserver154'
param publicIPAddresses_ToyTruckServer_ip_name string = 'ToyTruckServer-ip'
param networkSecurityGroups_ToyTruckServer_nsg_name string = 'ToyTruckServer-nsg'

resource networkSecurityGroups_ToyTruckServer_nsg_name_resource 'Microsoft.Network/networkSecurityGroups@2022-05-01' = {
  name: networkSecurityGroups_ToyTruckServer_nsg_name
  location: 'westus3'
  properties: {
    securityRules: []
  }
}

resource publicIPAddresses_ToyTruckServer_ip_name_resource 'Microsoft.Network/publicIPAddresses@2022-05-01' = {
  name: publicIPAddresses_ToyTruckServer_ip_name
  location: 'westus3'
  sku: {
    name: 'Standard'
    tier: 'Regional'
  }
  properties: {
    ipAddress: '1.2.3.4'
    publicIPAddressVersion: 'IPv4'
    publicIPAllocationMethod: 'Static'
    idleTimeoutInMinutes: 4
    ipTags: []
  }
}

resource virtualMachines_ToyTruckServer_name_resource 'Microsoft.Compute/virtualMachines@2022-08-01' = {
  name: virtualMachines_ToyTruckServer_name
  location: 'westus3'
  properties: {
    hardwareProfile: {
      vmSize: 'Standard_D2s_v3'
    }
    storageProfile: {
      imageReference: {
        publisher: 'canonical'
        offer: '0001-com-ubuntu-server-focal'
        sku: '20_04-lts-gen2'
        version: 'latest'
      }
      osDisk: {
        osType: 'Linux'
        name: '${virtualMachines_ToyTruckServer_name}_disk1_23e6a144c4ea4049b3e2be24b78a9e81'
        createOption: 'FromImage'
        caching: 'ReadWrite'
        managedDisk: {
          storageAccountType: 'Premium_LRS'
          id: resourceId('Microsoft.Compute/disks', '${virtualMachines_ToyTruckServer_name}_disk1_23e6a144c4ea4049b3e2be24b78a9e81')
        }
        deleteOption: 'Delete'
        diskSizeGB: 30
      }
      dataDisks: []
    }
    osProfile: {
      computerName: virtualMachines_ToyTruckServer_name
      adminUsername: 'toytruckadmin'
      linuxConfiguration: {
        disablePasswordAuthentication: false
        provisionVMAgent: true
        patchSettings: {
          patchMode: 'ImageDefault'
          assessmentMode: 'ImageDefault'
        }
        enableVMAgentPlatformUpdates: false
      }
      secrets: []
      allowExtensionOperations: true
      requireGuestProvisionSignal: true
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: networkInterfaces_toytruckserver154_name_resource.id
          properties: {
            deleteOption: 'Detach'
          }
        }
      ]
    }
    diagnosticsProfile: {
      bootDiagnostics: {
        enabled: true
      }
    }
  }
}

resource virtualNetworks_ToyTruck_vnet_name_resource 'Microsoft.Network/virtualNetworks@2022-05-01' = {
  name: virtualNetworks_ToyTruck_vnet_name
  location: 'westus3'
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [
      {
        name: 'default'
        id: virtualNetworks_ToyTruck_vnet_name_default.id
        properties: {
          addressPrefix: '10.0.0.0/24'
          delegations: []
          privateEndpointNetworkPolicies: 'Disabled'
          privateLinkServiceNetworkPolicies: 'Enabled'
        }
        type: 'Microsoft.Network/virtualNetworks/subnets'
      }
    ]
    virtualNetworkPeerings: []
    enableDdosProtection: false
  }
}

resource virtualNetworks_ToyTruck_vnet_name_default 'Microsoft.Network/virtualNetworks/subnets@2022-05-01' = {
  name: '${virtualNetworks_ToyTruck_vnet_name}/default'
  properties: {
    addressPrefix: '10.0.0.0/24'
    delegations: []
    privateEndpointNetworkPolicies: 'Disabled'
    privateLinkServiceNetworkPolicies: 'Enabled'
  }
  dependsOn: [
    virtualNetworks_ToyTruck_vnet_name_resource
  ]
}

resource networkInterfaces_toytruckserver154_name_resource 'Microsoft.Network/networkInterfaces@2022-05-01' = {
  name: networkInterfaces_toytruckserver154_name
  location: 'westus3'
  kind: 'Regular'
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        id: '${networkInterfaces_toytruckserver154_name_resource.id}/ipConfigurations/ipconfig1'
        etag: 'W/"6a38849d-bd59-4eae-856e-4909f7ac1fac"'
        type: 'Microsoft.Network/networkInterfaces/ipConfigurations'
        properties: {
          provisioningState: 'Succeeded'
          privateIPAddress: '10.0.0.4'
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            name: 'ToyTruckServer-ip'
            id: publicIPAddresses_ToyTruckServer_ip_name_resource.id
            properties: {
              provisioningState: 'Succeeded'
              resourceGuid: '07079685-0980-4ddf-acc3-3c8797c94b9a'
              publicIPAddressVersion: 'IPv4'
              publicIPAllocationMethod: 'Dynamic'
              idleTimeoutInMinutes: 4
              ipTags: []
              ipConfiguration: {
                id: '${networkInterfaces_toytruckserver154_name_resource.id}/ipConfigurations/ipconfig1'
              }
              deleteOption: 'Detach'
            }
            type: 'Microsoft.Network/publicIPAddresses'
            sku: {
              name: 'Basic'
              tier: 'Regional'
            }
          }
          subnet: {
            id: virtualNetworks_ToyTruck_vnet_name_default.id
          }
          primary: true
          privateIPAddressVersion: 'IPv4'
        }
      }
    ]
    dnsSettings: {
      dnsServers: []
    }
    enableAcceleratedNetworking: true
    enableIPForwarding: false
    disableTcpStateTracking: false
    networkSecurityGroup: {
      id: networkSecurityGroups_ToyTruckServer_nsg_name_resource.id
    }
    nicType: 'Standard'
  }
}

Observação

Algumas coisas podem ser diferentes no modelo, incluindo alguns dos nomes simbólicos, as versões da API e os endereços IP. Isso é normal. Você resolverá algumas dessas discrepâncias mais adiante no módulo.

Você criou um arquivo Bicep inicial para representar seus recursos. O arquivo Bicep não está bem estruturado e não segue as práticas recomendadas. Na próxima unidade, você aprenderá a aprimorar a qualidade do modelo migrado.

Dica

Se você usar um sistema de controle de versão como o Git, esse será um bom momento para fazer commit do seu trabalho.

Depois de verificar o arquivo main.bicep, feche o arquivo template.bicep.