Exercício - Converter e migrar recursos

Concluído

Importante

Precisa da sua própria subscrição do Azure para executar este exercício e poderá incorrer em custos. Se ainda não tiver uma subscrição 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 para a máquina virtual foram criados manualmente usando o portal do Azure. Nesta unidade, você começará o processo de migração dos recursos para um arquivo Bicep.

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

  • Implante uma nova máquina virtual usando o portal do Azure.
  • Exporte os recursos da máquina virtual para um modelo JSON.
  • Descompile o modelo JSON para Bicep.
  • Crie um novo arquivo Bicep e mova os recursos do modelo descompilado.

Este exercício usa a extensão Bicep para Visual Studio Code. Certifique-se de que instala esta 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, você primeiro implantará uma máquina virtual usando o portal do Azure.

  1. Inicie sessão no portal do Azure.

  2. Na home page do Azure, em Serviços do Azure, selecione Criar um recurso:

    Captura de ecrã que mostra o portal do Azure. A opção Criar um recurso é realçada.

    O Azure Marketplace aparece no painel Criar um recurso .

  3. Em Ubuntu Server 20.04 LTS, selecione Criar:

    Captura de ecrã que mostra o Azure Marketplace. O link Criar no Ubuntu Server 20.04 LTS é destacado.

    Importante

    Se você não vir o Ubuntu Server 20.04 LTS, vá diretamente para o Ubuntu Server 20.04 LTS no Azure Marketplace.

  4. Na guia Noções básicas, insira os seguintes valores para cada configuração. Use os padrões para todas as outras configurações.

    Definição Value
    Detalhes do projeto
    Grupo de recursos Selecione Criar novo e digite ToyTruck
    Detalhes da instância
    Virtual machine name ToyTruckServer
    País/Região (EUA) Oeste dos EUA 3
    Opções de disponibilidade Não existem redundâncias de infraestruturas necessárias
    Image Ubuntu Server 20.04 LTS - x64 Gen2
    Tamanho Standard_D2s_v3
    Conta de administrador
    Authentication type Palavra-passe
    Username toytruckadmin
    Palavra-passe Introduza uma palavra-passe
    Regras de porta de entrada
    Portas de entrada públicas Nenhuma
  5. Na guia Gerenciamento, verifique se a opção Habilitar desligamento automático não está selecionada.

  6. Selecione Rever + Criar. O Azure valida suas configurações. Talvez seja necessário inserir ou selecionar mais informações, dependendo dos requisitos de imagem.

  7. Selecione 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 estiver concluída, selecione o nome do grupo de recursos para abrir o grupo de recursos:

    Captura de ecrã do portal do Azure que mostra a implementação. O nome do grupo de recursos é realçado.

    O grupo de recursos agora contém a máquina virtual e suas dependências:

    Captura de ecrã 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 à esquerda, em Automação, selecione Exportar modelo:

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

    Um modelo JSON é gerado. Pode levar um ou dois minutos para que o processo seja concluído.

  2. Selecione o botão Download :

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

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

  3. Descompacte o arquivo para uma pasta que você pode acessar facilmente, como sua área de trabalho.

  4. Abra o Visual Studio Code.

Prepare o seu ambiente local

  1. No menu Terminal, selecione New Terminal (Novo Terminal). A janela do terminal geralmente abre na metade inferior da tela.

  2. Se o shell mostrado no lado direito da janela do terminal for bash, o shell correto estará aberto e você poderá pular 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 a lista suspensa do shell do terminal mostrada e Git Bash Default selecionado.

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

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

  5. No terminal, vá para o diretório onde você salvou seu modelo. Por exemplo, se você salvou seu modelo na pasta de modelos , poderá usar este comando:

    cd templates
    

Instalar o Bicep

Execute o seguinte comando para garantir que você tenha a versão mais recente do Bicep:

az bicep install && az bicep upgrade
  1. No menu Terminal, selecione New Terminal (Novo Terminal). A janela do terminal geralmente abre na metade inferior da tela.

  2. Se o shell mostrado no lado direito da janela do terminal for powershell ou pwsh, o shell correto estará aberto e você poderá pular 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 um shell diferente de powershell ou pwsh for exibido, selecione a seta suspensa do shell e selecione PowerShell.

    Captura de tela da janela do terminal do Visual Studio Code, com a lista suspensa do shell do terminal mostrada 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á para o diretório onde você salvou seu modelo. Por exemplo, se você salvou seu modelo na pasta de modelos , poderá usar este comando:

    Set-Location -Path templates
    

Instalar a CLI do Bíceps

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

Descompilar o modelo JSON para Bicep

Use o decompile comando para criar um arquivo Bicep a partir do 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 decompile comando para criar um arquivo Bicep a partir do 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.

Inspecione o arquivo Bicep descompilado

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

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

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

Criar um novo arquivo Bicep

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

  2. Salve o arquivo vazio para que o Visual Studio Code carregue as ferramentas do Bíceps.

    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 View>Editor Layout>Split Right para abrir a guia main.bicep no painel direito.
    3. Feche a guia main.bicep no painel esquerdo.

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

Copie cada elemento para o seu 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 securityRules propriedade está vazia. Mais adiante neste módulo, você refatorará o arquivo para remover propriedades redundantes.

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

    Captura de tela do editor de código do Visual Studio 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 seus 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

    Nota

    Os nomes dos recursos em sua implantação podem ser diferentes dos recursos listados aqui. Encontre os recursos que têm nomes próximos a esses nomes.

    Ao copiar cada recurso, inspecione suas propriedades. Mais adiante neste módulo, você atualizará as propriedades e a configuração de cada recurso para estar em conformidade com as práticas recomendadas do Bicep.

    Gorjeta

    Ao converter ou exportar seus próprios modelos, você pode atualizar os recursos para seguir as práticas recomendadas à medida que os copia. Neste módulo, atualizamos os recursos separadamente para facilitar a compreensão de cada fase do processo de migração.

Verificar se há recursos ausentes

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

  2. Revise a lista de recursos e compare-a com a lista de recursos em seu 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 ecrã do portal do Azure que mostra o grupo de recursos, com o recurso de disco realçado.

    Quando você trabalha com máquinas virtuais no Bicep, não precisa definir explicitamente o recurso de disco gerenciado. Em vez disso, você define as propriedades da máquina virtual e o Azure cria o disco gerenciado para você 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, seu 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'
  }
}

Nota

Algumas coisas podem ser diferentes em seu modelo, incluindo alguns dos nomes simbólicos, versões de API e endereços IP. Não há problema. 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 melhores práticas. Na próxima unidade, você aprenderá como melhorar a qualidade do modelo migrado.

Gorjeta

Se você usa um sistema de controle de versão como o Git, este seria um bom momento para comprometer seu trabalho.

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