Exercício – Converter e migrar recursos
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.
Entre no portal do Azure.
Na página inicial do Azure, em Serviços do Azure, selecione Criar um recurso:
O Azure Marketplace aparece no painel Criar um recurso.
Em Ubuntu Server 20.04 LTS, selecione Criar:
Importante
Se o Ubuntu Server 20.04 LTS não aparecer, acesse o Ubuntu Server 20.04 LTS diretamente no Azure Marketplace.
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 Na guia Gerenciamento, verifique se a opção Habilitar desligamento automático não está selecionada.
Selecione Examinar + criar. O Azure validará as configurações. Talvez seja necessário inserir ou selecionar mais informações dependendo dos requisitos da imagem.
Escolha Criar para implantar e criar a VM.
O portal do Azure mostra a implantação enquanto ela está em andamento.
Quando a implantação for concluída, selecione o nome do grupo de recursos para abrir o grupo de recursos:
Agora, o grupo de recursos contém a máquina virtual e as respectivas dependências:
Exportar o conteúdo do grupo de recursos para um modelo JSON
No menu esquerdo, em Automação, selecione Exportar modelo:
Um modelo JSON será gerado. Podem ser necessários alguns minutos para que o processo seja concluído.
Selecione o botão de download:
O modelo JSON e o arquivo de parâmetros são baixados no computador como um arquivo zip.
Descompacte o arquivo em uma pasta que você possa acessar com facilidade, como a área de trabalho.
Abra o Visual Studio Code.
Preparar o ambiente local
No menu Terminal, selecione Novo Terminal. A janela do terminal geralmente é aberta na metade inferior da tela.
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.
Se um shell diferente de bash for exibido, selecione a seta suspensa do shell e selecione Azure Cloud Shell (Bash).
Na lista de shells de terminal, selecione bash.
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
No menu Terminal, selecione Novo Terminal. A janela do terminal geralmente é aberta na metade inferior da tela.
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.
Se aparecer um shell diferente do powershell ou pwsh, selecione a seta da lista de seleção do shell e escolha PowerShell.
Na lista de shells de terminal, selecione powershell ou pwsh.
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
No Visual Studio Code, crie um arquivo chamado main.bicep.
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).
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).
- Selecione a guia main.bicep.
- Selecione Exibir>Layout do Editor>Dividir à Direita para abrir a guia main.bicep no painel direito.
- Feche a guia main.bicep no painel esquerdo.
Copiar cada elemento no novo arquivo Bicep
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.O Visual Studio Code indica um erro porque o parâmetro
networkSecurityGroups_ToyTruckServer_nsg_name
está ausente:Copie o parâmetro para o arquivo main.bicep.
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
No portal do Azure, abra o grupo de recursos ToyTruck.
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: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.